摘要:匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此它的對象通常指向。如果對此有疑惑,可以看知乎上的答案知乎匿名函數(shù)的指向?yàn)槭裁词亲鳛閷ο蠓椒ǖ恼{(diào)用,指向該對象當(dāng)函數(shù)作為某個對象的方法調(diào)用時,就指這個函數(shù)所在的對象。
因?yàn)槿粘9ぷ髦薪?jīng)常使用到this,而且在JavaScript中this的指向問題也很容易讓人混淆一部分知識。
這段時間翻閱了一些書籍也查閱了網(wǎng)上一些資料然后結(jié)合自己的經(jīng)驗(yàn),為了能讓自己更好的理解this,進(jìn)而總結(jié)一篇文章。
this是 JavaScript 語言的一個關(guān)鍵字。它是函數(shù)運(yùn)行時,在函數(shù)體內(nèi)部自動生成的一個對象,只能在函數(shù)體內(nèi)部使用。
實(shí)際是在函數(shù)被調(diào)用時才發(fā)生的綁定,也就是說this具體指向什么,取決于你是怎么調(diào)用的函數(shù)。
這四種情況基本涵蓋了JavaScript中常見的this指向問題
1. 全局的函數(shù)調(diào)用,this指向windowvar a = 1; function fn() { console.log(this.a); } fn(); // 1
這種 情況下的this其實(shí)就是window對象,這個很好理解。
但是還有一種情況,就是匿名函數(shù)的this也會指向window。
var a= "window"; var obj={a: "object"} obj.fn=function(){ console.log(this.a);//Object +function(){ console.log(this.a)//window }() } obj.fn()
匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此它的this對象通常指向windows。
如果對此有疑惑,可以看知乎上的答案:知乎 - 匿名函數(shù)的this指向?yàn)槭裁词莣indow?
var a ="window" var obj={ a: "object", fn: function(){ console.log(this.a); } } obj.fn(); // object
當(dāng)函數(shù)作為某個對象的方法調(diào)用時,this就指這個函數(shù)所在的對象。
3. 作為構(gòu)造函數(shù)調(diào)用,this指向?qū)嵗?/b>function fn() { this.x = 1; } var obj = new fn(); console.log(obj.x) // 1
構(gòu)造函數(shù)中的this,在通過new之后會生成一個新對象,this就指這個新對象。
對new有疑問的話,可以看 冴羽的博客 JavaScript深入之new的模擬實(shí)現(xiàn)
var obj1={ a: "boj1" } var obj2={ a: "obj2" } var obj3={ a: "obj3" } function fn(){ console.log(this.a); } // apply fn.apply(obj1);// "obj1" // call fn.call(obj2);// "obj2" // bind var fnBind= fn.bind(obj3); fnBind();// "obj3"
call/ apply / bind 都有一個共同的特點(diǎn),就是改變this的指向,使用這種方法可以把別人的方法拿過來用到自己身上。
第一個參數(shù)為 null 的時候,視為指向 window.
var a="window" var obj={ a: "boj", fn: function (){ console.log(this.a); } } obj.fn.call(null);// "window"
在這里如果是obj.fn()調(diào)用的fn()方法,this應(yīng)該指向obj沒錯。
但是因?yàn)?b>call(null)的存在,改變了指向,所以this指向了window。
正因?yàn)楸容^難理解,所以this指向也是面試時最容易遇到的問題,比如下面這道我曾遇到的一個面試題:
var length = 10; function fn(){ console.log(this.length); } var obj = { length: 5, method: function(fn){ fn(); arguments[0](); } }; obj.method(fn, 1);
在這道題里,不僅考察了對this熟悉程度,還考察了函數(shù)的傳參形式、作用域、以及arguments這種特殊的數(shù)組的理解。
只有真正理解了這些才能正確的判斷this究竟指向了誰。
所以,只有對JavaScript中的各項(xiàng)知識點(diǎn)深入理解,才會對this的概念越加清晰。
參考:
阮一峰 - Javascript 的 this 用法
前端開發(fā)博客 - 深入理解JavaScript this
文章僅日常學(xué)習(xí)工作所得,歡迎大家訪問我的blog。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/101969.html
摘要:通過這種操作,就有了構(gòu)造函數(shù)的原型對象里的方法。你也看到了,就是一個普通對象,所以這種寄生式繼承適合于根據(jù)已有對象創(chuàng)建一個加強(qiáng)版的對象,在主要考慮通過已有對象來繼承而不是構(gòu)造函數(shù)的情況下,這種方式的確很方便。 原文地址在我的博客, 轉(zhuǎn)載請注明出處,謝謝! 標(biāo)簽: [es5對象、原型, 原型鏈, 繼承] 注意(這篇文章特別長)這篇文章僅僅是我個人對于JavaScript對象的理解,并不是...
摘要:因?yàn)槲覀冇眠@個函數(shù)來構(gòu)造對象,所以我們也把稱作構(gòu)造函數(shù)。所以通過定義構(gòu)造函數(shù),就相當(dāng)于定義了一個類,通過關(guān)鍵字,即可生成一個實(shí)例化的對象。 一、序言 ??和其他面向?qū)ο蟮恼Z言(如Java)不同,Javascript語言對類的實(shí)現(xiàn)和繼承的實(shí)現(xiàn)沒有標(biāo)準(zhǔn)的定義,而是將這些交給了程序員,讓程序員更加靈活地(當(dāng)然剛開始也更加頭疼)去定義類,實(shí)現(xiàn)繼承。(以下不討論ES6中利用class、exten...
摘要:函數(shù)式編程一開始我并不理解。漸漸地,我熟練掌握了使用函數(shù)式的方法去編程。但是自從學(xué)習(xí)了函數(shù)式編程,我將循環(huán)都改成了使用和來實(shí)現(xiàn)。只有數(shù)據(jù)和函數(shù),而且因?yàn)楹瘮?shù)沒有和對象綁定,更加容易復(fù)用。在函數(shù)式的中,這些問題不復(fù)存在。 譯者按: 當(dāng)從業(yè)20的JavaScript老司機(jī)學(xué)會函數(shù)式編程時,他扔掉了90%的特性,也不用面向?qū)ο罅?,最后發(fā)現(xiàn)了真愛?。。?! 原文: How I rediscov...
摘要:在函數(shù)中調(diào)用時指向調(diào)用函數(shù)的對象,調(diào)用函數(shù)的在不同情況下有直接調(diào)用,此時函數(shù)內(nèi)部的指向全局對象作為對象的方法,此時指向該對象構(gòu)造函數(shù),此時指向構(gòu)造的實(shí)例對象改變指向是語言的一個關(guān)鍵字。但是有一個總的原則,那就是指的是,調(diào)用函數(shù)的那個對象。 this在全局中調(diào)用時指向的是全局對象。this在函數(shù)中調(diào)用時指向調(diào)用函數(shù)的對象,調(diào)用函數(shù)的在不同情況下有 1.直接調(diào)用,此時函數(shù)內(nèi)部的this指向...
一直以來,我對ES6都不甚感興趣,一是因?yàn)樵谏a(chǎn)環(huán)境中使用ES5已是處處碰壁,其次則是只當(dāng)這ES6是語法糖不曾重視。只是最近學(xué)習(xí)react生態(tài),用起babel來轉(zhuǎn)換jsx之余,也不免碰到諸多用上ES6的教程、案例,因此便稍作學(xué)習(xí)。這一學(xué)習(xí),便覺得這語法糖實(shí)在是甜,忍不住嘗鮮,于是記錄部分自覺對自己有用的方法在此。 箭頭函數(shù)(Arrow Functions) 箭頭函數(shù)是一個典型的語法糖,即創(chuàng)造了一種...
閱讀 1408·2023-04-26 01:58
閱讀 2282·2021-11-04 16:04
閱讀 1753·2021-08-31 09:42
閱讀 1765·2021-07-25 21:37
閱讀 1066·2019-08-30 15:54
閱讀 2074·2019-08-30 15:53
閱讀 3047·2019-08-29 13:28
閱讀 2687·2019-08-29 10:56