箭頭函數(shù)在對(duì)象建炫、方法和類中的使用的差別

在對(duì)象中

看下面的一個(gè)例子,這里的 this 指向的是哪里呢疼蛾?

const money = {
    a: 1, 
    fn: () => {
        console.log(this)
    }
}

按照箭頭函數(shù)定義的解釋肛跌,誰實(shí)例化(或定義)就指向誰,那這里的 this 應(yīng)該是對(duì)象 money察郁。

事實(shí)卻不是這樣衍慎,執(zhí)行上面結(jié)果如下:

arrow_this_obj.png

可以這樣來理解,箭頭函數(shù)不會(huì)創(chuàng)建自己的 this皮钠,它只會(huì)從自己的作用域鏈的上一層繼承this稳捆。這里字面量的方式定義它封閉函數(shù)可以理解為就是 Window,所以這里箭頭函數(shù)的 this 也指向 Window

另一種理解是箭頭函數(shù)是用當(dāng)前的詞法作用域覆蓋 this 本來的值鳞芙,上面代碼里詞法作用域中 this 指向的是 Window

在方法中

function dollar() {
    this.fn = () => {
        console.log(this)
    }
}

new dollar().fn() // this -> dollar

在類中

class Dollar {
    fn = () => {
        console.log(this)
    }
}
new Dollar().fn() // this -> Dollar


class RMB {
    constructor(fn) {
        this.fn = fn
    }
}
new RMB(new Dollar().fn).fn() // this -> Dollar

  • 按照上面描述眷柔,this 繼承自上一層期虾,箭頭函數(shù)定義在方法或類中指向的就是實(shí)例本身原朝,不論方法在哪里執(zhí)行、誰來執(zhí)行镶苞。

普通函數(shù)中 this 的行為

this 指向執(zhí)行這個(gè)方法的上下文(對(duì)象或類)
函數(shù)根據(jù)它是被如何調(diào)用的來定義這個(gè)函數(shù)的this值

首先看一個(gè)普通的例子

class abe {
    fn() {
        console.log(this)
    }
}
class dd1 {
    constructor(d) {
        this.fn = d.fn
    }
}

new abe().fn() // this -> abe
new abe().fn.call(new dd1({})) // this -> dd1
new dd1(new abe()).fn() // this -> dd1

從這個(gè)結(jié)果可以看出 this 指向執(zhí)行時(shí)的上下文喳坠,即誰執(zhí)行指向誰。

const aba = {
    a: 1,
    fn: function() {
        console.log(this)
    }
}

function abi() {
    this.fn = function() {
        console.log(this)
    }
}
class abe {
    fn() {
        console.log(this)
    }
}

分別在對(duì)象茂蚓、方法壕鹉、類中驗(yàn)證剃幌,普通函數(shù)定義的 this 指向都滿足一致的規(guī)則溶锭,誰執(zhí)行指向誰井辆。

結(jié)論

  • 普通函數(shù)中 this 指向執(zhí)行這個(gè)方法的上下文(對(duì)象或類),誰執(zhí)行指向誰
  • 箭頭函數(shù)中 this 繼承自上一層的 this益兄,誰實(shí)例化指向誰脊凰,沒有實(shí)例的指向上一層(比如對(duì)象中定義的方法)
  • 不論普通 function 還是 arrow function 抖棘,直接執(zhí)行的 this 大多是指向當(dāng)前定義的上下文
  • 箭頭函數(shù)的特點(diǎn),語法簡(jiǎn)單狸涌、沒有自己的 this切省、arguments、new帕胆、prototype

一個(gè)特殊的箭頭函數(shù)

箭頭函數(shù)不會(huì)創(chuàng)建自己的this,它只會(huì)從自己的作用域鏈的上一層繼承this朝捆。
箭頭函數(shù)沒有定義this綁定。

function c() {
    this.fn = () => {
        console.log(this)
    };
    return this
}

new c().fn() // c
c().fn() // window
// 可以這樣理解
// c() 沒有執(zhí)行上下文默認(rèn)是 window懒豹,那箭頭函數(shù)指向上一層也是 window
// new 的操作是創(chuàng)建一個(gè)空對(duì)象并將這個(gè)對(duì)象做為 this 的上下文
'use strict';
var obj = {
  a: 10
};

Object.defineProperty(obj, "b", {
  get: () => {
    console.log(this.a, typeof this.a, this);
    return this.a+10; 
   // 代表全局對(duì)象 'Window', 因此 'this.a' 返回 'undefined'
  }
});

obj.b;

參照

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_functions

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芙盘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子脸秽,更是在濱河造成了極大的恐慌何陆,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豹储,死亡現(xiàn)場(chǎng)離奇詭異贷盲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)剥扣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門巩剖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钠怯,你說我怎么就攤上這事佳魔。” “怎么了晦炊?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵鞠鲜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我断国,道長(zhǎng)贤姆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任稳衬,我火速辦了婚禮霞捡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘薄疚。我一直安慰自己碧信,他們只是感情好赊琳,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著砰碴,像睡著了一般躏筏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呈枉,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天寸士,我揣著相機(jī)與錄音,去河邊找鬼碴卧。 笑死弱卡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的住册。 我是一名探鬼主播婶博,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼荧飞!你這毒婦竟也來了凡人?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤叹阔,失蹤者是張志新(化名)和其女友劉穎挠轴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耳幢,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岸晦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了睛藻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片启上。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖店印,靈堂內(nèi)的尸體忽然破棺而出冈在,到底是詐尸還是另有隱情,我是刑警寧澤按摘,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布包券,位于F島的核電站,受9級(jí)特大地震影響炫贤,放射性物質(zhì)發(fā)生泄漏溅固。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一照激、第九天 我趴在偏房一處隱蔽的房頂上張望发魄。 院中可真熱鬧,春花似錦俩垃、人聲如沸励幼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苹粟。三九已至,卻和暖如春跃闹,著一層夾襖步出監(jiān)牢的瞬間嵌削,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工望艺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苛秕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓找默,卻偏偏與公主長(zhǎng)得像艇劫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惩激,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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