ES6箭頭函數(shù)與普通函數(shù)的區(qū)別

箭頭函數(shù)與普通函數(shù)的區(qū)別

作為ES6中新加入的箭頭函數(shù)語法,深受廣大開發(fā)人員的喜愛衫哥,也是平時(shí)前端面試過程中經(jīng)常會(huì)被提及問道的典型題目。它不僅簡化了我們的代碼,而且也讓開發(fā)人員擺脫了“飄忽不定”的this指向怜校,本文就箭頭函數(shù)與普通函數(shù)的區(qū)別進(jìn)行一些分析。

在我看來注竿,面試官最關(guān)注的也是兩者最關(guān)鍵的區(qū)別就是this指向的區(qū)別茄茁,普通函數(shù)中的this指向函數(shù)被調(diào)用的對象,因此對于不同的調(diào)用者巩割,this的值是不同的裙顽。而箭頭函數(shù)中并沒有自己的this(同時(shí),箭頭函數(shù)中也沒有其他的局部變量宣谈,如this愈犹,argument,super等)闻丑,所以箭頭函數(shù)中的this是固定的漩怎,它指向定義該函數(shù)時(shí)所在的對象。

普通函數(shù)

相信大家對普通函數(shù)的用法已經(jīng)非常熟悉了嗦嗡,下面我們舉一個(gè)簡單的例子勋锤。

var a  = 3;
var obj = {
    a : 1,
    foo : function(){
        console.log(this.a);
    }
}
obj.foo(); //1
var bar = obj;
bar.a = 2;
bar.foo(); //2
var baz = obj.foo;
baz(); //3

上述代碼中,出現(xiàn)了三種情況:

  1. 直接通過obj調(diào)用其中的方法foo侥祭,此時(shí)怪得,this就會(huì)指向調(diào)用foo函數(shù)的對象,也就是obj;
  2. 將obj對象賦給一個(gè)新的對象bar卑硫,此時(shí)通過bar調(diào)用foo函數(shù)徒恋,this的值就會(huì)指向調(diào)用者bar;
  3. 將obj.foo賦給一個(gè)新對象baz欢伏,通過baz()調(diào)用foo函數(shù)入挣,此時(shí)的this指向window;

由此我們可以得出結(jié)論:

  • 普通函數(shù)的this總是指向它的直接調(diào)用者硝拧。
  • 在嚴(yán)格模式下径筏,沒找到直接調(diào)用者,則函數(shù)中的this是undefined障陶。
  • 在默認(rèn)模式下(非嚴(yán)格模式)滋恬,沒找到直接調(diào)用者,則函數(shù)中的this指向window抱究。

再考慮一下下面的情況:

var obj = {
    a : 1,
    foo : function(){
        setTimeout(
            function(){console.log(this.a),3000})
    }
}
obj.foo(); //undefined

你可能會(huì)認(rèn)為此時(shí)的輸出應(yīng)該為1恢氯,但是結(jié)果卻是undefined。因?yàn)榇藭r(shí)this的指向是全局的window對象。
通過以上例子勋拟,可以得出以下總結(jié):

  • 對于方法(即通過對象調(diào)用了該函數(shù))勋磕,普通函數(shù)中的this總是指向它的調(diào)用者。
  • 對于一般函數(shù)敢靡,this指向全局變量(非嚴(yán)格模式下)或者undefined(嚴(yán)格模式下)挂滓。在上例中setTimeout中的function未被任何對象調(diào)用,因此它的this指向還是window對象啸胧。因此赶站,這也可以總結(jié)成:javascript 的this 可以簡單的認(rèn)為是后期綁定,沒有地方綁定的時(shí)候纺念,默認(rèn)綁定window或undefined亲怠。

如果我們希望可以在上例的setTimeout函數(shù)中使用this要怎么做呢?在箭頭函數(shù)出現(xiàn)之前柠辞,我們往往會(huì)使用以下兩種方法:

  1. 在setTimeout函數(shù)的外部,也就是上層函數(shù)foo內(nèi)部通過將this值賦給一個(gè)臨時(shí)變量來實(shí)現(xiàn)主胧。
var obj = {
    a : 1,
    foo : function(){
        var that  = this;
        setTimeout(
            function(){console.log(that.a),3000})
    }
}
obj.foo(); //1
  1. 通過bind()來綁定this叭首。
var obj = {
    a : 1,
    foo : function(){
        setTimeout(
            function(){console.log(this.a),3000}.bind(this))
    }
}
obj.foo(); //1

這種現(xiàn)象在ES6引入箭頭函數(shù)后得到了改善。

箭頭函數(shù)

箭頭函數(shù)是ES6中引入的新特性踪栋,使用方法為:

()=>{console.log(this)}

其中()內(nèi)是要帶入的參數(shù)焙格,{}內(nèi)是要執(zhí)行的語句。箭頭函數(shù)是函數(shù)式編程的一種體現(xiàn)夷都,函數(shù)式編程將更多的關(guān)注點(diǎn)放在輸入和輸出的關(guān)系眷唉,省去了過程的一些因素,因此箭頭函數(shù)中沒有自己的this囤官,arguments冬阳,new target(ES6)和 super(ES6)。箭頭函數(shù)相當(dāng)于匿名函數(shù)党饮,因此不能使用new來作為構(gòu)造函數(shù)使用肝陪。
箭頭函數(shù)中的this始終指向其父級作用域中的this。換句話說刑顺,箭頭函數(shù)會(huì)捕獲其所在的上下文的this值氯窍,作為自己的this值。任何方法都改變不了其指向蹲堂,如call(), bind(), apply()狼讨。在箭頭函數(shù)中調(diào)用 this 時(shí),僅僅是簡單的沿著作用域鏈向上尋找政供,找到最近的一個(gè) this 拿來使用,它與調(diào)用時(shí)的上下文無關(guān)犬耻。我們用代碼來解釋一下。

var obj = {
    a: 10,
    b: () => {
      console.log(this.a); // undefined
      console.log(this); // Window {postMessage: ?, blur: ?, focus: ?, close: ?, frames: Window, …}
    },
    c: function() {
      console.log(this.a); // 10
      console.log(this); // a: 10, b: ?, c: ?, d: ?, e: ?
    },
    d:function(){
        return ()=>{
            console.log(this.a); // 10
        }
    },
    e:function(){
      setTime
    }

  }
  obj.b(); 
  obj.c();
  obj.d()();

簡單分析一下代碼执泰,obj.b()中的this會(huì)繼承父級上下文中的this值,也就是與obj有相同的this指向计济,為全局變量window。obj.c()的this指向即為調(diào)用者obj排苍,obj.d().()中的this也繼承自父級上下文中的this沦寂,即d的this指向传藏,也就是obj彤守。
通過這個(gè)例子具垫,也就可以大概的讓我們理解普通函數(shù)中的this和匿名函數(shù)中的this指向差別,從而更好的在工作中根據(jù)我們的需求正確合理地使用這兩種函數(shù)卦碾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洲胖,一起剝皮案震驚了整個(gè)濱河市坯沪,隨后出現(xiàn)的幾起案子屏箍,更是在濱河造成了極大的恐慌,老刑警劉巖卸奉,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榄棵,死亡現(xiàn)場離奇詭異,居然都是意外死亡拧略,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門呛占,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晾虑,“玉大人糙捺,你說我怎么就攤上這事遂跟】粒” “怎么了哄尔?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵岭接,是天一觀的道長鸣戴。 經(jīng)常有香客問我,道長创千,這世上最難降的妖魔是什么追驴? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任殿雪,我火速辦了婚禮冠摄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沃呢。我一直安慰自己拆挥,他們只是感情好纸兔,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布汉矿。 她就那樣靜靜地躺著洲拇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪男翰。 梳的紋絲不亂的頭發(fā)上蛾绎,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天租冠,我揣著相機(jī)與錄音薯嗤,去河邊找鬼应民。 笑死夕吻,一個(gè)胖子當(dāng)著我的面吹牛涉馅,可吹牛的內(nèi)容都是我干的黄虱。 我是一名探鬼主播捻浦,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤栅贴,失蹤者是張志新(化名)和其女友劉穎注暗,沒想到半個(gè)月后赚楚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體左胞,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡躺枕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年近她,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捅暴。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖亲轨,靈堂內(nèi)的尸體忽然破棺而出讯嫂,到底是詐尸還是另有隱情莉掂,我是刑警寧澤库正,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布属瓣,位于F島的核電站,受9級特大地震影響粗截,放射性物質(zhì)發(fā)生泄漏湿酸。R本人自食惡果不足惜昂利,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一扩所、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嫉拐,春花似錦婉徘、人聲如沸化撕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春纵隔,著一層夾襖步出監(jiān)牢的瞬間舒岸,已是汗流浹背蛾派。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工岂贩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親榜贴。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

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

  • 函數(shù)參數(shù)的默認(rèn)值 基本用法 在ES6之前蓝纲,不能直接為函數(shù)的參數(shù)指定默認(rèn)值锹漱,只能采用變通的方法毕泌。 上面代碼檢查函數(shù)l...
    呼呼哥閱讀 3,402評論 0 1
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持伯顶,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠蝎抽,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 6,926評論 15 54
  • 函數(shù)和對象 1、函數(shù) 1.1 函數(shù)概述 函數(shù)對于任何一門語言來說都是核心的概念驮履。通過函數(shù)可以封裝任意多條語句,而且...
    道無虛閱讀 4,578評論 0 5
  • 箭頭函數(shù)與傳統(tǒng)JavaScript的不同 先來談?wù)凟S5中的this 在ES5中蹂喻,每個(gè)函數(shù)在被調(diào)用時(shí)都會(huì)自動(dòng)取得t...
    打鐵大師閱讀 1,297評論 4 21
  • 今天生日耶蔓彩,昨個(gè)看了曉說講三體然后聽的毛骨悚然。我翻了幾十頁沒看完等孵,沒太看下去,因?yàn)橛兄芪耐跤蛛娮佑螒蚝脧?fù)雜的樣子...
    Sussi閱讀 120評論 0 0