箭頭函數(shù)

箭頭函數(shù)就是個(gè)簡(jiǎn)寫形式的函數(shù)表達(dá)式锹雏,并且它擁有詞法作用域的this值(即不會(huì)新產(chǎn)生自己作用域下的this, arguments, supernew.target等對(duì)象)。此外赞弥,箭頭函數(shù)總是匿名的店读。

箭頭函數(shù)的引入有兩個(gè)方面的影響:一是更簡(jiǎn)短的函數(shù)書寫纫普,而是對(duì) this 的詞法解析嫁艇。

更短的函數(shù)

在一些函數(shù)式編程模式里朗伶,更短的函數(shù)書寫方式很受歡迎。試比較:

var a = [
  "Hydrogen",
  "Helium",
  "Lithium",
  "Beryl-lium"
];

var a2 = a.map(function(s){ return s.length });

var a3 = a.map( s => s.length );
不綁定 this

在箭頭函數(shù)出現(xiàn)之前步咪,每個(gè)新定義的函數(shù)都有其自己的 this 值(例如论皆,構(gòu)造函數(shù)的 this 指向了一個(gè)新的對(duì)象;嚴(yán)格模式下的函數(shù)的 this 值為 undefined猾漫;如果函數(shù)是作為對(duì)象的方法被調(diào)用的点晴,則其 this 指向了那個(gè)調(diào)用他的對(duì)象)。在面向?qū)ο箫L(fēng)格的辦成中悯周,這杯證明是非常惱人的事情粒督。

function Person() {
  // 構(gòu)造函數(shù) Person() 定義的 `this` 就是新實(shí)例對(duì)象自己
  this.age = 0;
  setInterval(function growUp() {
    // 在非嚴(yán)格模式下,growUp() 函數(shù)定義了其內(nèi)部的 `this`
    // 為全局對(duì)象, 不同于構(gòu)造函數(shù)Person()的定義的 `this`
    this.age++; 
  }, 1000);
}

var p = new Person();

在 ECMAScript 3/5 中禽翼,這個(gè)問(wèn)題可以通過(guò)新增一個(gè)變量來(lái)指向期望的 this 對(duì)象屠橄,然后將該變量放到閉包中來(lái)解決。

function Person() {
  var self = this; // 也有人選擇使用 `that` 而非 `self`. 
                   // 只要保證一致就好.
  self.age = 0;

  setInterval(function growUp() {
    // 回調(diào)里面的 `self` 變量就指向了期望的那個(gè)對(duì)象了
    self.age++;
  }, 1000);
}

除此之外闰挡,還可以使用bind函數(shù)锐墙,把期望的this值傳遞給 growUp()函數(shù)。
箭頭函數(shù)則會(huì)捕獲其所在上下文的this值长酗,作為自己的this值溪北,因此下面的額代碼將如期運(yùn)行。

function Person(){
  this.age = 0;

  setInterval(() => {
    this.age++; // |this| 正確地指向了 person 對(duì)象
  }, 1000);
}

var p = new Person();
與 strict mode 的關(guān)系

考錄到 this 是詞法層面上的夺脾,嚴(yán)格模式中與 this 相關(guān)的規(guī)則都將被忽略之拨。

var f = () => {'use strict'; return this};
f() === window; // 或全局對(duì)象
使用 call 或 apply 調(diào)用

由于 this 已經(jīng)在此法層面完成了綁定,通過(guò) call() 或 apply() 方法調(diào)用一個(gè)函數(shù)時(shí)咧叭,只是傳入了參數(shù)而已敦锌,對(duì) this 并沒(méi)有什么影響:

var adder = {
  base : 1,
    
  add : function(a) {
    var f = v => v + this.base;
    return f(a);
  },

  addThruCall: function(a) {
    var f = v => v + this.base;
    var b = {
      base : 2
    };
            
    return f.call(b, a);
  }
};

console.log(adder.add(1));         // 輸出 2
console.log(adder.addThruCall(1)); // 仍然輸出 2(而不是3 ——譯者注)
不綁定 arguments

將頭函數(shù)不會(huì)在其內(nèi)部爆出 arguments 對(duì)象:arguments.length, arguments[0], arguments[1] 等等,都不會(huì)指向箭頭函數(shù)的 arguments佳簸,而是指向了箭頭函數(shù)所在作用域的一個(gè)明為 argument 的值(如果有的活乙墙,否則,就是 undefined生均。)听想。

var arguments = 42;
var arr = () => arguments;

arr(); // 42

function foo() {
  var f = () => arguments[0]; // foo's implicit arguments binding
  return f(2);
}

foo(1); // 1

降頭函數(shù)沒(méi)有自己的 arguments 對(duì)象,不過(guò)在大多數(shù)情形下马胧, rest參數(shù)可以給出一個(gè)解決方案:

function foo() { 
  var f = (...args) => args[0]; 
  return f(2); 
}

foo(1); // 2
像方法一樣使用箭頭函數(shù)

如上所述汉买,箭頭函數(shù)表達(dá)式對(duì)沒(méi)有方法名的函數(shù)時(shí)最合適的,讓我們?cè)囍阉麄冏鳛榉椒〞r(shí)發(fā)生了什么佩脊。

'use strict';
var obj = {
  i: 10,
  b: () => console.log(this.i, this),
  c: function() {
    console.log( this.i, this)
  }
}
obj.b(); // prints undefined, Window
obj.c(); // prints 10, Object {...}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛙粘,一起剝皮案震驚了整個(gè)濱河市垫卤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌出牧,老刑警劉巖穴肘,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異舔痕,居然都是意外死亡评抚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門伯复,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)慨代,“玉大人,你說(shuō)我怎么就攤上這事啸如∈坛祝” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵叮雳,是天一觀的道長(zhǎng)丈积。 經(jīng)常有香客問(wèn)我,道長(zhǎng)债鸡,這世上最難降的妖魔是什么江滨? 我笑而不...
    開(kāi)封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮厌均,結(jié)果婚禮上唬滑,老公的妹妹穿的比我還像新娘。我一直安慰自己棺弊,他們只是感情好晶密,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著模她,像睡著了一般稻艰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侈净,一...
    開(kāi)封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天尊勿,我揣著相機(jī)與錄音,去河邊找鬼畜侦。 笑死元扔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的旋膳。 我是一名探鬼主播澎语,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了擅羞?” 一聲冷哼從身側(cè)響起尸变,我...
    開(kāi)封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤室叉,失蹤者是張志新(化名)和其女友劉穎垛膝,沒(méi)想到半個(gè)月后窃判,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蛋哭,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年俯逾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡草慧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匙头,到底是詐尸還是另有隱情漫谷,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布蹂析,位于F島的核電站舔示,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏电抚。R本人自食惡果不足惜惕稻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝙叛。 院中可真熱鬧俺祠,春花似錦、人聲如沸借帘。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肺然。三九已至蔫缸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間际起,已是汗流浹背拾碌。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留街望,地道東北人倦沧。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像它匕,于是被迫代替她去往敵國(guó)和親展融。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • JavaScript深入理解ES6中的箭頭函數(shù) 箭頭函數(shù)表達(dá)式的語(yǔ)法比函數(shù)表達(dá)式短,并且不綁定自己的 this告希,a...
    488a74c3bb61閱讀 964評(píng)論 0 7
  • 箭頭函數(shù)是什么扑浸?(What) 箭頭函數(shù) (Arrow Functions)也稱“胖箭頭函數(shù)”,是ES6全新的特性燕偶。...
    _LG_閱讀 3,473評(píng)論 2 11
  • 本文地址:http://www.reibang.com/p/16dd8acb0b13 前言 this 指向問(wèn)題是入...
    Chris_dc閱讀 3,184評(píng)論 2 5
  • 箭頭函數(shù) ES6標(biāo)準(zhǔn)新增了一種新的函數(shù):Arrow Function(箭頭函數(shù))喝噪。 為什么叫Arrow Funct...
    yujiawei007閱讀 263評(píng)論 0 0
  • 基本語(yǔ)法 ES6 允許使用“箭頭”(=>)定義函數(shù)。 上面的箭頭函數(shù)相當(dāng)于: 如果箭頭函數(shù)不需要參數(shù)或需要多個(gè)參數(shù)...
    iyimao閱讀 689評(píng)論 0 6