ES6: 箭頭函數(shù)

1. 語法

按常規(guī)語法定義函數(shù):

function funcName(params) {

? ? return params + 2;

}

funcName(2);

該函數(shù)改成箭頭函數(shù):

var funcName = params => params + 2;

funcName(2);

我們來深入了解箭頭函數(shù)的語法:

parameters => {

? ? statements;

};

如果沒有參數(shù),那么可以進一步簡化:

() => {

? ? statements;

};

如果只有一個參數(shù)煌往,可以省略括號:

parameters => {

? ? statements;

};

如果函數(shù)體只有一句返回值,可以省略大括號和return

parameters => true;

等價于:

parameters => { return true;};

2. 箭頭函數(shù)和普通函數(shù)的區(qū)別

(1) 沒有this

箭頭函數(shù)沒有this藤树,需要通過查找作用域鏈來確定this的值。因此如果箭頭函數(shù)被非箭頭函數(shù)包裹栋烤,this綁定的就是最近一層非箭頭函數(shù)的this.

下面的例子是經(jīng)常遇到的:

var obj = {

? ? birth: 1990,

? ? getAge: function () {

? ? ? ? var b = this.birth; // 1990

? ? ? ? var fn = function () {

       console.log(this); // this指向的是window或者undefined

? ? ? ? ? ? return new Date().getFullYear() - this.birth;

? ? ? ? };

? ? ? ? return fn();

? ? }

};

obj.getAge(); //NaN

上面的輸出結(jié)果是NaN历帚,因為fn是函數(shù)表達式,會有一個this指向它声邦,不能拿到外層函數(shù)的this,而fn沒有birth屬性摆舟,所以this.birth是undefined亥曹,因此輸出結(jié)果是NaN。

要修復(fù)這個問題恨诱,可以把外層的this保存起來媳瞪,然后再內(nèi)層函數(shù)使用:

var obj = {

? ? birth: 1990,

? ? getAge: function () {

? ? ? ? console.log(this.birth);

var self = this;

? ? ? ? var fn = function () {

? ? ? ? ? ? return new Date().getFullYear() - self.birth;

? ? ? ? };

? ? ? ? return fn();

? ? }

};

obj.getAge(); // 29

或者通過call或者apply將this傳到內(nèi)部函數(shù)中:

var obj = {

? ? birth: 1990,

? ? getAge: function () {

? ? ? ? var b = this.birth; // 1990

? ? ? ? var fn = function () {

? ? ? ? ? ? return new Date().getFullYear() - this.birth;

? ? ? ? };

? ? ? ? return fn.apply(this); // 或者:return fn.call(this);

? ? }

};

obj.getAge(); // 29

?現(xiàn)在可以通過箭頭函數(shù)的方法解決了:

var obj = {

? ? birth: 1990,

? ? getAge: function () {

? ? ? ? var b = this.birth; // 1990

? ? ? ? var fn = () => new Date().getFullYear() - this.birth; // this.birth仍是1990,因為this還是外部函數(shù)的this

? ? ? ? return fn();

? ? }

};

obj.getAge(); // 29

但是如果把外部函數(shù)也改成箭頭函數(shù)照宝,結(jié)果又是不一樣的了:

var obj = {

? ? birth: 1990,

? ? getAge:? (year) => {

? ? ? ? var b = this.birth; // 1990

? ? ? ? var fn = () => {

  console.log(this); // window

? ? return new Date().getFullYear() - this.birth; // this.birth是undefined

    ? }

? ? ? ? return fn();

? ? }

};

obj.getAge(); // NaN

因為外部函數(shù)也是箭頭函數(shù)蛇受,所以不會有this, 就會按照作用域鏈繼續(xù)往上尋找,這段代碼的往上尋找厕鹃,找到的this是window兢仰;

所以箭頭函數(shù)this指向的關(guān)鍵是找到最近的非箭頭函數(shù)的this


(2) 沒有arguments

箭頭函數(shù)沒有自己的arguamnets對象乍丈, 但是箭頭函數(shù)可以訪問外圍函數(shù)的arguments對象;看下面兩個例子:

varFoo = () => {console.log(arguments)};

Foo(); // ReferenceError: arguments is not defined

function myFunc(age) {

var Foo = () => {console.log(arguments)};

return Foo();

}

myFunc(12);

代碼執(zhí)行結(jié)果:


第一段代碼:輸出箭頭函數(shù)的argument報錯,說明箭頭函數(shù)是沒有arguments對象的

第二段代碼:在箭頭函數(shù)中輸出的arguments對象信息name為myFunc, 說明箭頭函數(shù)中的是外圍函數(shù)的arguments, 而第一段代碼沒有外圍函數(shù)把将,所以會報錯轻专。


(3) 不能通過new關(guān)鍵字調(diào)用

js的函數(shù)有兩個內(nèi)部方法:[[call]]和[[Construct]]

當(dāng)通過new調(diào)用構(gòu)造函數(shù)時,執(zhí)行[[Construct]]方法秸弛,創(chuàng)建一個實例對象,然后再執(zhí)行函數(shù)體洪碳,將this綁定到實例上递览。當(dāng)直接調(diào)用的時候,執(zhí)行[[call]]方法瞳腌,直接執(zhí)行函數(shù)體绞铃。

箭頭函數(shù)并沒有[[Construct]]方法,不能被用作構(gòu)造函數(shù)嫂侍,因此通過new的方式調(diào)用儿捧,會報錯。

varFun = () => {};varfun =newFun();// typeError: Fun is not a constructor


(4) 沒有原型

由于不能使用new調(diào)用箭頭函數(shù)挑宠,所以也沒有構(gòu)建原型的需求菲盾,于是箭頭函數(shù)也不存在prototype這個屬性。

varFun = () => {};

console.log(Fun.prototype); // undefined

(5) 沒有super

箭頭函數(shù)沒有原型各淀,所以不能通過super來訪問原型的屬性懒鉴,所以箭頭函數(shù)是沒有super的,super的值由最近一層非箭頭函數(shù)決定碎浇。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末临谱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子奴璃,更是在濱河造成了極大的恐慌悉默,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苟穆,死亡現(xiàn)場離奇詭異抄课,居然都是意外死亡,警方通過查閱死者的電腦和手機雳旅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門剖膳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岭辣,你說我怎么就攤上這事吱晒。” “怎么了沦童?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵仑濒,是天一觀的道長叹话。 經(jīng)常有香客問我,道長墩瞳,這世上最難降的妖魔是什么驼壶? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮喉酌,結(jié)果婚禮上热凹,老公的妹妹穿的比我還像新娘。我一直安慰自己泪电,他們只是感情好般妙,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著相速,像睡著了一般碟渺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上突诬,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天苫拍,我揣著相機與錄音,去河邊找鬼旺隙。 笑死绒极,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蔬捷。 我是一名探鬼主播集峦,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抠刺!你這毒婦竟也來了塔淤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤速妖,失蹤者是張志新(化名)和其女友劉穎高蜂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罕容,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡备恤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了锦秒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片露泊。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖旅择,靈堂內(nèi)的尸體忽然破棺而出惭笑,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布沉噩,位于F島的核電站捺宗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏川蒙。R本人自食惡果不足惜蚜厉,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望畜眨。 院中可真熱鬧昼牛,春花似錦、人聲如沸康聂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽早抠。三九已至霎烙,卻和暖如春撬讽,著一層夾襖步出監(jiān)牢的瞬間蕊连,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工游昼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留甘苍,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓烘豌,卻偏偏與公主長得像载庭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子廊佩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

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