迷一樣的 this

各種 this 常常令人非常迷惑烹笔,至今只能理解簡單的情況,對于復(fù)雜的情況 this 傳來傳去抛丽,綁來綁去谤职。。亿鲜。還是會暈允蜈,不能透徹的理解冤吨。

this is neither a reference to the function itself, nor is it a reference to the function's lexical scope.
this is actually a binding that is made when a function is invoked, and what it references is determined entirely by the call-site where the function is called.

this 既不指向函數(shù),也不指向函數(shù)的 scope, 而是在函數(shù)執(zhí)行時動態(tài)綁定到所處的上下文饶套。

this 到底綁定到什么漩蟆,有 4 種基本的情況:

Default Binding

function foo() {
    console.log( this.a );
}

var a = 2;

foo(); // 2

this 默認會綁定到 global 對象

function foo() {
    "use strict";

    console.log( this.a );
}

var a = 2;

foo(); // TypeError: `this` is `undefined`

只有在非嚴格模式下才允許 this 綁定到 global, 嚴格模式下不允許綁定到 global

Implicit Binding 隱式綁定

function foo() {
    console.log( this.a );
}

var obj = {
    a: 2,
    foo: foo
};

obj.foo(); // 2

用一個對象 obj 去調(diào)用函數(shù),這時 this 就綁定到函數(shù)所在的對象

Explicit Binding 顯示綁定

function foo() {
    console.log( this.a );
}

var obj = {
    a: 2
};

foo.call( obj ); // 2

通過 call 或 apply 顯示調(diào)用一個函數(shù)并傳遞一個對象進去妓蛮,這時 this 就綁定到傳入的對象上怠李。這種情況最好理解。

new Binding

function foo(a) {
    this.a = a;
}

var bar = new foo( 2 );
console.log( bar.a ); // 2

當(dāng)用 new 調(diào)用一個函數(shù)時主要做了下面4件事

  1. a brand new object is created
  2. the newly constructed object is [[Prototype]]-linked
  3. the newly constructed object is set as the this binding for that function call
  4. unless the function returns its own alternate object, the new-invoked function call will automatically return the newly constructed object.

當(dāng)用 new 調(diào)用一個函數(shù)時蛤克,底層默認會新建一個對象捺癞,this 會綁定到這個新建的對象上。默認函數(shù)會返回這個新建的對象构挤,當(dāng)然也可以返回其它的對象髓介。

Determining the this binding for an executing function requires finding the direct call-site of that function. Once examined, four rules can be applied to the call-site, in this order of precedence:

  1. Called with new? Use the newly constructed object.

  2. Called with call or apply (or bind)? Use the specified object.

  3. Called with a context object owning the call? Use that context object.

  4. Default: undefined in strict mode, global object otherwise.

總結(jié)下來就是找到函數(shù)調(diào)用點,依次看看是否符合以上 4 條規(guī)則

  1. 如果用 new 調(diào)用筋现, this 綁定到函數(shù)新建的對象上
  2. 顯示調(diào)用直接綁定到傳入的對象上
  3. 通過對象調(diào)用唐础,綁定到函數(shù)所在的對象上
  4. 默認綁定到 global 對象

Lexical this

function foo() {
    // return an arrow function
    return () => {
        // `this` here is lexically adopted from `foo()`
        console.log( this.a );
    };
}
var obj1 = {
    a:100
};
var a = 200;
foo.call(obj1)(); // 100

arrow-functions adopt the this binding from the enclosing (function or global) scope.

ES6 的 => 函數(shù)中的 this 會綁定到它所在的 scope 的 this。這里就是 foo 的 this矾飞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末一膨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子洒沦,更是在濱河造成了極大的恐慌汞幢,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件微谓,死亡現(xiàn)場離奇詭異森篷,居然都是意外死亡,警方通過查閱死者的電腦和手機豺型,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門仲智,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姻氨,你說我怎么就攤上這事钓辆。” “怎么了肴焊?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵前联,是天一觀的道長。 經(jīng)常有香客問我娶眷,道長似嗤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任届宠,我火速辦了婚禮烁落,結(jié)果婚禮上乘粒,老公的妹妹穿的比我還像新娘。我一直安慰自己伤塌,他們只是感情好灯萍,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著每聪,像睡著了一般旦棉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上药薯,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天他爸,我揣著相機與錄音,去河邊找鬼果善。 笑死,一個胖子當(dāng)著我的面吹牛系谐,可吹牛的內(nèi)容都是我干的巾陕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼纪他,長吁一口氣:“原來是場噩夢啊……” “哼鄙煤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起茶袒,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤梯刚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后薪寓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亡资,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年向叉,在試婚紗的時候發(fā)現(xiàn)自己被綠了锥腻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡母谎,死狀恐怖瘦黑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奇唤,我是刑警寧澤幸斥,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站咬扇,受9級特大地震影響甲葬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜懈贺,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一演顾、第九天 我趴在偏房一處隱蔽的房頂上張望供搀。 院中可真熱鬧,春花似錦钠至、人聲如沸葛虐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屿脐。三九已至,卻和暖如春宪卿,著一層夾襖步出監(jiān)牢的瞬間的诵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工佑钾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留西疤,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓休溶,卻偏偏與公主長得像代赁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子兽掰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容