都說 JavaScript 是一種很靈活的語言,這其實(shí)也可以說它是一個混亂的語言。它把 函數(shù)式編程 和 面向?qū)ο缶幊?糅合一起,再加上 動態(tài)語言 特性,簡直強(qiáng)大無比(其實(shí)是不能和C++比的,^_^ )。
JS 里的 this
在 function 內(nèi)部被創(chuàng)建
指向調(diào)用時所在函數(shù)所綁定的對象(拗口)
this 不能被賦值,但可以被 call/apply 改變
目錄
* 一個特例
* 開始判斷
* 法則一:對象方法中的this指向?qū)ο蟊旧恚^函數(shù)形式的除外)
* 法則二:多層嵌套函數(shù)中的this指向等同于包含該this的最近一個function的this
* 法則三:箭頭函數(shù)以及非指向?qū)ο蠓椒ㄖ械膄unction的情況下this指向window
* 習(xí)題集
* 普通函數(shù)中的this
* 函數(shù)執(zhí)行后返回另外一個函數(shù)中的this(普通函數(shù)中)
* 多層嵌套函數(shù)中的this(定時器&箭頭函數(shù))1
* 多層嵌套函數(shù)中的this(定時器&箭頭函數(shù))2
一個特例
在正式開始之前,我們先來說一個特例。
在構(gòu)造函數(shù)中,this上的值會在創(chuàng)建實(shí)例的時候被綁定到新創(chuàng)建的實(shí)例上。不適用于下面的判斷方法,所以特此說明。
開始判斷
下面是一個典型例子,我們的分析從這里開始。
法則一:對象方法中的this指向?qū)ο蟊旧恚^函數(shù)形式的除外)
法則二:多層嵌套函數(shù)中的this指向等同于包含該this的最近一個function的this
箭頭函數(shù)沒有獨(dú)立的this作用域,所以繼續(xù)往外層走,走到了getName: function(){}。那么就是他了,this指向等同于這個function內(nèi)部的this指向。根據(jù)法則一,this指向?qū)ο蟊旧怼?/p>
我們可以試著在瀏覽器中運(yùn)行,看看結(jié)果。
法則三:箭頭函數(shù)以及非指向?qū)ο蠓椒ㄖ械膄unction的情況下this指向window
根據(jù)法則二,this是指向最近的function,因此,這里的this等同于返回的函數(shù)中的this,不是對象方法中的this,所以,指向全局。
是不是感覺有點(diǎn)奇怪?不過實(shí)踐證明確實(shí)如此。
習(xí)題集
歡迎大家按照法則一到三依次判斷,猜測結(jié)果,并在瀏覽器下測試。測試結(jié)果也可以回復(fù),大家一起討論。
因本人能力有限,該系列法則可能在部分情況下失效。歡迎大家一起討論。
下面是做題時間。
普通函數(shù)中的this
函數(shù)執(zhí)行后返回另外一個函數(shù)中的this(普通函數(shù)中)
多層嵌套函數(shù)中的this(定時器&箭頭函數(shù))1
多層嵌套函數(shù)中的this(定時器&箭頭函數(shù))2
再次說明,該法則為實(shí)驗(yàn)性法則,未進(jìn)行大范圍的測試,不保證在所有情況下都有一致的結(jié)果。如果你發(fā)現(xiàn)了法則判斷失敗的情況,歡迎留言,一起探討。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com