js es6 => arrow function箭頭函數(shù)

參考
JavaScript-ES6中的箭頭函數(shù)(Arrow Function)

一席楚、實(shí)例

可以在https://www.tslang.cn/點(diǎn)擊 練習(xí)觀察ES6的箭頭函數(shù)和ES5之間的對(duì)應(yīng)。
1.當(dāng)你只需要一個(gè)只有一個(gè)參數(shù)的簡(jiǎn)單函數(shù)時(shí)秘蛇,可以使用新標(biāo)準(zhǔn)中的箭頭函數(shù),它的語(yǔ)法非常簡(jiǎn)單:標(biāo)識(shí)符=>表達(dá)式匙瘪。你無需輸入function和return索昂,一些小括號(hào)、大括號(hào)以及分號(hào)也可以省略俺夕。

// ES5
var selected = allJobs.filter(function (job) {
    return job.isSelected();
});
// ES6
var selected = allJobs.filter(job => job.isSelected());

2.如果要寫一個(gè)接受多重參數(shù)(也可能沒有參數(shù)裳凸,或者是不定參數(shù)、默認(rèn)參數(shù)劝贸、參數(shù)解構(gòu))的函數(shù)姨谷,你需要用小括號(hào)包裹參數(shù)list。

// ES5
var total = values.reduce(function (a, b) {
    return a + b;
}, 0);
// ES6
var total = values.reduce((a, b) => a + b, 0);

3.那么不是非常函數(shù)化的情況又如何呢映九?除表達(dá)式外梦湘,箭頭函數(shù)還可以包含一個(gè)塊語(yǔ)句启绰≌悖回想一下我們之前的示例:

// ES5
$("#confetti-btn").click(function (event) {
    playTrumpet();
    fireConfettiCannon();
});
// ES6
$("#confetti-btn").click(event => {
    playTrumpet();
    fireConfettiCannon();
});

注意茅逮,使用了塊語(yǔ)句的箭頭函數(shù)不會(huì)自動(dòng)返回值膊存,你需要使用return語(yǔ)句將所需值返回。

二禁灼、新的箭頭函數(shù)的語(yǔ)法管挟,不止是語(yǔ)法上的簡(jiǎn)便,還解決了this的指向問題

1.讓我們假設(shè)我們有一個(gè)對(duì)象有一個(gè)叫做sayLater的函數(shù)

let obj = {
    name: "asim",
    sayLater: function() {
        console.log(`${this.name}`);
    }
};
obj.sayLater();

在sayLater函數(shù)中弄捕,這個(gè)this的指向是obj,所以console.log的值為asim.現(xiàn)在讓我們來試一下用setTimeout函數(shù)輸出的值是多少

let obj = {
    name: "asim",
    sayLater: function () {
        setTimeout(function () {
            console.log(`${this.name}`);
        }, 1000);
    }
};
obj.sayLater();

但是上面輸出的值確實(shí)undefined

2.調(diào)用上下文
這個(gè)結(jié)果取決于這個(gè)函數(shù)的調(diào)用方式.在最基本的調(diào)用上obj.sayLater()僻孝,這個(gè)值是調(diào)用上下文,值為obj.那在setTimeout的匿名函數(shù)中呢守谓?this會(huì)指向什么呢穿铆?

setTimeout(function () {
    console.log(`${this.name}`);
}, 1000);

他的答案就看情況了,在瀏覽器中斋荞,值是undefined或者是global對(duì)象荞雏,這個(gè)取決于是使用'use strict'或者非嚴(yán)格模式下,在node中他是一個(gè)超時(shí)對(duì)象平酿。所以在setTimeout的例子中凤优,this的值不會(huì)是obj,所以最后this.name返回的要么就是undefined或者是報(bào)錯(cuò)了蜈彼。這樣不穩(wěn)定的語(yǔ)法是個(gè)頭疼的問題筑辨,也是javascript一直存在的問題,在es5中有很多方法解決這個(gè)問題幸逆,但是一般比較常用的方法就是棍辕,在調(diào)用上面聲明個(gè)變量,一般叫做self或者vm还绘,然后把這個(gè)用在函數(shù)中

let obj = {
    name: "asim",
    sayLater: function () {
        let self = this; // Assign to self
        console.log(self);
        setTimeout(function () {
            console.log(`${self.name}`); // Use self not this
        }, 1000);
    }
};

但是在es6中楚昭,我們有更好的方式解決這個(gè)問題,如果我們使用箭頭函數(shù)蚕甥,那箭頭函數(shù)里面的this的值和外面的值是一樣的

let obj = {
    name: "asim",
    sayLater: function () {
        console.log(this); // `this` points to obj
        setTimeout(() => {
            console.log(this); // `this` points to obj
            console.log(`${this.name}`); // `this` points to obj
        }, 1000);
    }
};
obj.sayLater();

可以嘗試著跑以上的代碼哪替,就發(fā)現(xiàn)this輸出來的都是obj

再看一個(gè)例子

var foo = {
    arr:[1,2,3],
    sum:0,
    testA:function(){
        this.arr.forEach(function(x){
            this.sum += x;//這里的this指向的不是foo
        });
        alert(this.sum);//0
    },
    testB:function(){
        this.arr.forEach(x => this.sum+=x);//this指向的是foo
        alert(this.sum);//6
    }
};
foo.testA();
foo.testB();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市菇怀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晌块,老刑警劉巖爱沟,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異匆背,居然都是意外死亡呼伸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來括享,“玉大人搂根,你說我怎么就攤上這事×逑剑” “怎么了剩愧?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)娇斩。 經(jīng)常有香客問我仁卷,道長(zhǎng),這世上最難降的妖魔是什么犬第? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任锦积,我火速辦了婚禮,結(jié)果婚禮上歉嗓,老公的妹妹穿的比我還像新娘丰介。我一直安慰自己,他們只是感情好鉴分,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布哮幢。 她就那樣靜靜地躺著,像睡著了一般冠场。 火紅的嫁衣襯著肌膚如雪家浇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天碴裙,我揣著相機(jī)與錄音钢悲,去河邊找鬼。 笑死舔株,一個(gè)胖子當(dāng)著我的面吹牛莺琳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播载慈,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼惭等,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了办铡?” 一聲冷哼從身側(cè)響起辞做,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寡具,沒想到半個(gè)月后秤茅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡童叠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年框喳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡五垮,死狀恐怖乍惊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情放仗,我是刑警寧澤润绎,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站匙监,受9級(jí)特大地震影響凡橱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亭姥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一稼钩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧达罗,春花似錦坝撑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至扶认,卻和暖如春侨拦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辐宾。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工狱从, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叠纹。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓季研,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親誉察。 傳聞我的和親對(duì)象是個(gè)殘疾皇子与涡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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

  • 函數(shù)參數(shù)的默認(rèn)值 基本用法 在ES6之前,不能直接為函數(shù)的參數(shù)指定默認(rèn)值持偏,只能采用變通的方法驼卖。 上面代碼檢查函數(shù)l...
    呼呼哥閱讀 3,363評(píng)論 0 1
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券鸿秆,享受所有官網(wǎng)優(yōu)惠款慨,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 2,892評(píng)論 0 16
  • 1.函數(shù)參數(shù)的默認(rèn)值 (1).基本用法 在ES6之前,不能直接為函數(shù)的參數(shù)指定默認(rèn)值谬莹,只能采用變通的方法。
    趙然228閱讀 686評(píng)論 0 0
  • 函數(shù)就是最基本的一種代碼抽象的方式。 定義函數(shù)function abs(x) {if (x >=0){return...
    _我和你一樣閱讀 442評(píng)論 0 0
  • D:\JAVAANDROID\adt-bundle-windows-x86_64_20140101\sdk\too...
    SmallTwo閱讀 180評(píng)論 0 0