【翻譯】你知道何時(shí)使用或者不使用ES6箭頭函數(shù)嗎捡鱼?

首先不得不承認(rèn)颗胡,箭頭函數(shù)是ES6中非常受歡迎的一個(gè)功能毫深,它提出了一種新的書寫方式來(lái)簡(jiǎn)潔的定義函數(shù)。

舉例說(shuō)明:

ES5:

function timesTwo(params) {
  return params * 2;
}

timesTwo(4); //8

使用ES6箭頭函數(shù):

const timesTwo = params => params * 2;

timesTwo(4); //8

代碼更簡(jiǎn)短毒姨,而且可以省略大括號(hào)和return語(yǔ)句(在沒(méi)有代碼塊的情況下)哑蔫。與ES5相比,為何箭頭函數(shù)的表現(xiàn)方式可以有如此大的不同呢弧呐?

各種變量

你可能見(jiàn)過(guò)箭頭函數(shù)有很多種的使用方式闸迷,比如:

  1. 沒(méi)有參數(shù)

如果沒(méi)有參數(shù),可以在=>之前放置一個(gè)空括號(hào)

const a = () => 42
a() //42

實(shí)際上俘枫, 我們甚至不需要括號(hào):

const a = _ => 42
a() //42
  1. 一個(gè)參數(shù)

在這種情況下腥沽,括號(hào)是可選的:

const a = x => 42 || const a = (x) => 42
a() || a(1) //42
  1. 多個(gè)參數(shù)

此時(shí),必須加括號(hào):

const a = (x, y) => 42
a(1, 2) //42
  1. 語(yǔ)句(而非表達(dá)式)

在最基本的形式中鸠蚪,表達(dá)式會(huì)產(chǎn)生一個(gè)值今阳,而語(yǔ)句代表著一種待執(zhí)行的行為,比如if else語(yǔ)句茅信。使用箭頭函數(shù)時(shí)盾舌,語(yǔ)句必須有大括號(hào)。而一旦使用了花括號(hào)汹押,就必須添加return 關(guān)鍵字矿筝。

在箭頭函數(shù)中使用if語(yǔ)句的例子:

var feedTheCat = (cat) => {
  if (cat === 'hungry') {
    return 'Feed the cat';
  } else {
    return 'Do not feed the cat';
  }
}
  1. 代碼塊

如果你的代碼在一個(gè)塊中,就必須顯式的使用return語(yǔ)句棚贾。

var addValues = (x, y) => {
  return x + y
}
  1. 對(duì)象字面量

如果需要返回一個(gè)對(duì)象窖维,就要使用()包裹榆综。這會(huì)迫使解釋器去評(píng)估括號(hào)內(nèi)的內(nèi)容,能夠正確的返回對(duì)象铸史。

const obj = x =>({ y: x })
obj(1) //{y: 1}

匿名語(yǔ)法

箭頭函數(shù)是匿名的鼻疮,這會(huì)帶來(lái)一些問(wèn)題:

  1. 難以debug

出現(xiàn)錯(cuò)誤時(shí),無(wú)法追蹤該方法名稱或具體的執(zhí)行行號(hào)(個(gè)人不是很認(rèn)同琳轿,箭頭函數(shù)相當(dāng)于匿名函數(shù)判沟,將其地址賦值給變量后不是一樣的使用么)

  1. 沒(méi)有自引用

如果你需要自引用(比如遞歸),使用箭頭函數(shù)難以實(shí)現(xiàn)崭篡。

主要的優(yōu)點(diǎn): 不用顯式綁定this

在函數(shù)表達(dá)式中挪哄,this是根據(jù)它被調(diào)用的上線文綁定到不同的值的,但是在箭頭函數(shù)中琉闪,this是直接被綁定到詞法作用域的迹炼。this 就是指向包含著箭頭函數(shù)的這段代碼。

舉個(gè)栗子:

//ES5
var obj = {
  id: 42,
  counter: function counter() {
    setTimeout(function() {
      console.log(this.id);
    }.bind(this), 1000);
  }
};

在上段代碼中颠毙,bind(this)不能省略斯入,否則this將指向window,從而this.id打印出undefined.

//ES6
var obj = {
  id: 42,
  counter: function counter() {
    setTimeout(() => {
      console.log(this.id);
    }, 1000);
  }
};

箭頭函數(shù)不能綁定到this關(guān)鍵字蛀蜜,所以它會(huì)在詞法上上升一個(gè)作用域刻两,然后在定義的作用域中使用這個(gè)值。

何時(shí)不該使用箭頭函數(shù)滴某?

經(jīng)過(guò)上邊幾個(gè)例子磅摹,應(yīng)該也能意識(shí)到箭頭函數(shù)并不能完全替代常規(guī)的函數(shù)。那么何時(shí)我們不該使用箭頭函數(shù)呢壮池?

  1. 對(duì)象方法
var cat = {
  lives: 9,
  jumps: () => {
    this.lives--;
  }
}

調(diào)用cat.jumps()后偏瓤,cat.lives并不會(huì)減1。這是因?yàn)閠his就沒(méi)有被綁定到這個(gè)對(duì)象上椰憋,而是從父級(jí)作用域繼承了this.

  1. 具有動(dòng)態(tài)context的回調(diào)函數(shù)

當(dāng)context需要?jiǎng)討B(tài)改變的時(shí)候厅克,箭頭函數(shù)通常不是正確的選擇。比如在一個(gè)事件句柄中:

var button = document.getElementById('press');
button.addEventListener('click', () => {
  this.classList.toggle('on');
});

如果我們點(diǎn)擊按鈕橙依,我們會(huì)得到一個(gè)TypeError证舟。這是因?yàn)閠his不是綁定到按鈕,而是綁定到了它的父級(jí)窗骑。

  1. 當(dāng)使用箭頭函數(shù)使你的代碼可讀性降低(難以知道這段代碼將發(fā)生什么)的時(shí)候

何時(shí)使用箭頭函數(shù)女责?

箭頭函數(shù)最能發(fā)揮功力的場(chǎng)景就是需要this綁定到context,而非函數(shù)本身的時(shí)候创译。我還尤其喜歡在map或者reduce方法中使用箭頭函數(shù)抵知,這使得程序可讀性更強(qiáng)。

Reference:

閱讀原文

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市刷喜,隨后出現(xiàn)的幾起案子残制,更是在濱河造成了極大的恐慌,老刑警劉巖掖疮,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件初茶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡浊闪,警方通過(guò)查閱死者的電腦和手機(jī)恼布,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)搁宾,“玉大人折汞,你說(shuō)我怎么就攤上這事∶颓Γ” “怎么了字支?”我有些...
    開(kāi)封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵凤藏,是天一觀的道長(zhǎng)奸忽。 經(jīng)常有香客問(wèn)我,道長(zhǎng)揖庄,這世上最難降的妖魔是什么栗菜? 我笑而不...
    開(kāi)封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蹄梢,結(jié)果婚禮上疙筹,老公的妹妹穿的比我還像新娘。我一直安慰自己禁炒,他們只是感情好而咆,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著幕袱,像睡著了一般暴备。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上们豌,一...
    開(kāi)封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天涯捻,我揣著相機(jī)與錄音,去河邊找鬼望迎。 笑死障癌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辩尊。 我是一名探鬼主播涛浙,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了轿亮?” 一聲冷哼從身側(cè)響起晾捏,我...
    開(kāi)封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哀托,沒(méi)想到半個(gè)月后惦辛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仓手,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年胖齐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗽冒。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呀伙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出添坊,到底是詐尸還是另有隱情剿另,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布贬蛙,位于F島的核電站雨女,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏阳准。R本人自食惡果不足惜氛堕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望野蝇。 院中可真熱鬧讼稚,春花似錦、人聲如沸绕沈。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乍狐。三九已至赠摇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澜躺,已是汗流浹背蝉稳。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掘鄙,地道東北人耘戚。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像操漠,于是被迫代替她去往敵國(guó)和親收津。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饿这,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 函數(shù)和對(duì)象 1、函數(shù) 1.1 函數(shù)概述 函數(shù)對(duì)于任何一門語(yǔ)言來(lái)說(shuō)都是核心的概念撞秋。通過(guò)函數(shù)可以封裝任意多條語(yǔ)句长捧,而且...
    道無(wú)虛閱讀 4,525評(píng)論 0 5
  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,118評(píng)論 0 13
  • 函數(shù)參數(shù)的默認(rèn)值 基本用法 在ES6之前吻贿,不能直接為函數(shù)的參數(shù)指定默認(rèn)值串结,只能采用變通的方法。 上面代碼檢查函數(shù)l...
    呼呼哥閱讀 3,357評(píng)論 0 1
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,321評(píng)論 8 265
  • 微雨眾卉新舅列,一雷驚蟄始肌割。晨起燈下習(xí)字伴出蟄。四尺四開(kāi)書云鶴有奇翼帐要。
    逸之何春雷閱讀 1,349評(píng)論 22 42