一句話明白箭頭函數(shù)中的this

關(guān)于箭頭函數(shù)中this值的問題,網(wǎng)上查查谐算,會(huì)告訴你 “箭頭函數(shù)的this固定化,箭頭函數(shù)中的this綁定定義時(shí)所在的作用域......”归露,好繞洲脂!

箭頭函數(shù)中this倒底指向誰?一句話剧包,箭頭函數(shù)內(nèi)的this就是箭頭函數(shù)外的那個(gè)this恐锦! 為什么?因?yàn)榧^函數(shù)沒有自己的this疆液。

如果你已明白這句話的意思一铅,那么本文到此結(jié)束,你可以去看看別的更有營(yíng)養(yǎng)的東西了堕油。
如果我這句話描述的不清楚潘飘,或你對(duì)它有懷疑,請(qǐng)繼續(xù)往下看掉缺。如果說錯(cuò)了請(qǐng)使勁拍磚卜录。
查看原文
直接上代碼!

注:以下代碼全基于瀏覽器非嚴(yán)格模式運(yùn)行眶明,且假定你已經(jīng)對(duì)非箭頭函數(shù)中的this全然了解

咱先定義一個(gè)全局變量a艰毒,后面所有的示例都假定此全局變量已存在:

var a = 0;

第一個(gè)示例:

// demo1
var obj =  {
  a: 1,
  b1: this.a,
  b2: () => this.a,
};

console.log(obj.b1);  // 0
console.log(obj.b2());  // 0

根據(jù)結(jié)果可以看到obj對(duì)象中的屬性b1的值來自全局變量a,而不是obj對(duì)象的屬性a,也就是說b1: this.a,中的this指向window赘来。而b2: () => this.a,中的this同樣指向window现喳,返回全局變量a的值凯傲。

第二個(gè)示例:

// demo2
(function fn(){
  var a = 2;
  console.log(this.a);  // 0

  const subf = ()=>this.a;
  console.log(subf()); // 0
})()

第三個(gè)示例:

// demo3
var obj2 =  {
  a: 3,
  b1: function(){ return this.a;},
  b2: function(){ return ()=>this.a},
};
console.log(obj2.b1());  // 3
console.log(obj2.b2()());  // 3

這個(gè)示例中箭頭函數(shù)外的this是哪個(gè)?我們?cè)诩^函數(shù)外面加個(gè)this.a看看:

var obj2 =  {
  a: 3,
  b1: function(){ return this.a;},
  b2: function(){ return this.a,()=>this.a},
};
console.log(obj2.b1());  // 3
console.log(obj2.b2()());  // 3

第四個(gè)示例:

// demo4
var obj3 =  {
  a: 4,
  b1: function(){ return this.a;},
  b2: function(){ return ()=> () => () => this.a},
};
console.log(obj4.b1());  // 4
console.log(obj4.b2()()()());  // 4

這里箭頭函數(shù)返回箭頭函數(shù)再返回箭頭函數(shù)嗦篱,最后一個(gè)箭頭函數(shù)返回this.a冰单。這個(gè)this是誰?就是最后箭頭函數(shù)外面的外面的外面的那個(gè)this,也就是obj3.b1中的那個(gè)this,也就是obj3.a。:)
實(shí)情是這樣:箭頭函數(shù)沒有自己的this意述,所以不管嵌套多少層,都不影響this是誰荒叼。

第五個(gè)示例:

// demo5
function f0() {
  var a = 5;

  setTimeout(function() {
    var b1 = this.a;
    console.log(b1);  // 0
  }, 100);

  setTimeout(function() {
    var b2 = ()=> this.a;
    console.log(b2());  // 0
  }, 200);
}

f0(); // 0  0

我們都知道setTimeout中的那個(gè)function運(yùn)行于全局環(huán)境下,因此里面的this指向window典鸡。而箭頭函數(shù)沒有自己的this被廓,所以第二個(gè)setTimeout中箭頭函數(shù)的this也指向window.

那么setTimeout的第一個(gè)參數(shù)使用箭頭函數(shù)會(huì)是個(gè)什么情況?看下一個(gè)示例萝玷。

第六個(gè)示例:

// demo6
function f1() {
  console.log(this.a); 
  setTimeout(() => {
    console.log(this.a);  
  }, 100);
}
f1(); // 0  0

這里箭頭函數(shù)作為setTimeout的第一個(gè)參數(shù)嫁乘,箭頭函數(shù)外面的那個(gè)this是誰?把箭頭函數(shù)換成this.fn()

function f1() {
  console.log(this.a); // 0
  setTimeout(this.fn() , 100); 
}

我們這里不用了解this.fn()有什么功能,看到它我們就會(huì)明白了this.fn()中的this和前面一行中的this.a中的this是同一個(gè)this球碉。

擴(kuò)展一下:

// 這樣執(zhí)行
f1.call({a: 7});  // 7  7

結(jié)果是輸出兩個(gè)7,
為什么蜓斧?

// demo6
function f1() {
  console.log(this.a);   // 因?yàn)橥ㄟ^call對(duì)this的綁定,f1中的this指向 {a: 7}
  setTimeout(() => {
    console.log(this.a);  // 同樣這里this指向 {a: 7}
  }, 100);
}

同理:

var bindf1 = f1.bind({a: 8}); 
bindf1(); // 8 8

總結(jié)

箭頭函數(shù)沒有自己的this睁冬,箭頭函數(shù)中用this和普通語句中的this沒什么區(qū)別挎春,所以,你知道非箭頭函數(shù)下怎么用this,就知道箭頭函數(shù)下怎么用this豆拨。
關(guān)于 “箭頭函數(shù)對(duì)this固定化直奋,箭頭函數(shù)中的this綁定定義時(shí)所在的作用域,箭頭函數(shù)不能通過 call() 或 apply() 方法綁定this” 等描述辽装,都源于箭頭函數(shù)沒有自己的this帮碰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拾积,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丰涉,老刑警劉巖拓巧,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異一死,居然都是意外死亡肛度,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門投慈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來承耿,“玉大人冠骄,你說我怎么就攤上這事〖哟” “怎么了凛辣?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)职烧。 經(jīng)常有香客問我扁誓,道長(zhǎng),這世上最難降的妖魔是什么蚀之? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任蝗敢,我火速辦了婚禮,結(jié)果婚禮上足删,老公的妹妹穿的比我還像新娘寿谴。我一直安慰自己,他們只是感情好失受,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布讶泰。 她就那樣靜靜地躺著,像睡著了一般贱纠。 火紅的嫁衣襯著肌膚如雪峻厚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天谆焊,我揣著相機(jī)與錄音惠桃,去河邊找鬼。 笑死辖试,一個(gè)胖子當(dāng)著我的面吹牛辜王,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播罐孝,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼呐馆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了莲兢?” 一聲冷哼從身側(cè)響起汹来,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎改艇,沒想到半個(gè)月后收班,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谒兄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年摔桦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片承疲。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邻耕,死狀恐怖鸥咖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兄世,我是刑警寧澤啼辣,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站碘饼,受9級(jí)特大地震影響熙兔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜艾恼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一住涉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钠绍,春花似錦舆声、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至磷脯,卻和暖如春蛾找,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赵誓。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工打毛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俩功。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓幻枉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親诡蜓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子熬甫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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

  • 普通函數(shù)中的this: this總是代表它的直接調(diào)用者(js的this是執(zhí)行上下文), 例如 obj.func ,...
    紫陌蘭溪閱讀 1,918評(píng)論 1 0
  • 葡萄藤PPT JS中this的指向 大家好,我是IT修真院鄭州分院第6期的學(xué)員王棟蔓罚,一枚正直椿肩、純潔、善良的前端程序...
    17064閱讀 624評(píng)論 0 2
  • 箭頭函數(shù)與傳統(tǒng)JavaScript的不同 先來談?wù)凟S5中的this 在ES5中豺谈,每個(gè)函數(shù)在被調(diào)用時(shí)都會(huì)自動(dòng)取得t...
    打鐵大師閱讀 1,288評(píng)論 4 21
  • 和小伙伴們?cè)俅位氐綄W(xué)校的時(shí)候覆旱,心里有什么想法也沒有,只是覺得看到大家熟悉又陌生的臉核无,覺得開心不已。我們漫步在學(xué)校的...
    皮卡是只貓閱讀 152評(píng)論 0 0
  • 曾經(jīng)一段時(shí)間我很喜歡咪蒙和她的文字吐根。筆鋒犀利正歼,讀來大快人心,描述感同身受拷橘,是個(gè)努力拼搏傳遞正能量不矯情的姑娘局义。她最...
    日斤同閱讀 715評(píng)論 0 0