【二十】箭頭函數(shù)

ES6標(biāo)準(zhǔn)新增了一種新的函數(shù):Arrow Function(箭頭函數(shù))。
為什么叫Arrow Function? 因?yàn)樗亩x用的就是一個(gè)箭頭:

x => x*x

上面的箭頭函數(shù)相當(dāng)于:

function (x) {
    return x * x;
}

測(cè)試瀏覽器是否支持ES6的Arrow Function:

'use strict';
var fn = x => x * x;
alert('你的瀏覽器支持ES6的Arrow Function!');

箭頭函數(shù)相當(dāng)于匿名函數(shù),并且簡(jiǎn)化了函數(shù)定義。箭頭函數(shù)有兩種格式,一種像上面的,只包含了一個(gè)表達(dá)式,連{ ... }和return都省略掉了。還有一種可以包含多條語(yǔ)句,這時(shí)候就不能省略{ ... }和return:

x => {
    if (x > 0) {
        return x*x;
    }
    else {
        return -x*x;
    }
}

如果參數(shù)不是一個(gè),就需要用括號(hào)()括起來(lái):

//  兩個(gè)參數(shù);
(x, y) => x * x + y * y

// 無(wú)參數(shù);
() => 3.14

// 可變參數(shù);
(x, y, ...rest) => {
    var i, sum = x + y;
    for (i=0; i<rest.length; i++) {
        sum += rest[i];
    }
    return sum;
}

如果要返回一個(gè)對(duì)象,就要注意,如果是單表達(dá)式,這么寫(xiě)的話會(huì)報(bào)錯(cuò):

//SyntaxError:
x => { foo: x }

因?yàn)楹秃瘮?shù)體的{ ... } 有語(yǔ)法沖突,所以要改為:

//  ok;
x => ({ foo: x})

</br>

this
箭頭函數(shù)看上去是匿名函數(shù)的一種簡(jiǎn)寫(xiě),但實(shí)際上,箭頭函數(shù)和匿名函數(shù)有個(gè)明顯的區(qū)別:箭頭函數(shù)內(nèi)部的this是詞法作用域,由上下文確定。
回去前面的例子,由于JavaScript函數(shù)對(duì)this綁定的錯(cuò)誤處理,下面的例子無(wú)法得到預(yù)期結(jié)果:

var obj = {
    birth: 1990,
    getAge: function () {
        var b = this.birth; // 1990
        var fn = function () {
            return new Date().getFullYear() - this.birth;  // this指向window或undefined
        };
        return fn();
    }
}

現(xiàn)在,箭頭函數(shù)完全修復(fù)了this的指向,this總是指向詞法作用域,也就是外層調(diào)用者obj:

var obj = {
    birth: 1990,
    getAge: function () {
        var b = this.birth;  // 1990
        var fn = () => new Date().getFullYear()  - this.birth;  // this指向obj對(duì)象
        return fn();
    }
};
obj.getAge();  // 27

如果使用箭頭函數(shù),以前的那種hack寫(xiě)法:

var that = this;

就不再需要了。
由于this在箭頭函數(shù)中已經(jīng)按照詞法作用域綁定了,所以,用call()或者apply()調(diào)用箭頭函數(shù)時(shí),無(wú)法對(duì)this進(jìn)行綁定,即傳入的第一個(gè)參數(shù)被忽略:

var obj = {
    birth: 1990,
    getAge: function (year) {
        var b = this.birth;  // 1990
        var fn = (y) => y - this.birth;  // this.birth仍是1990
        return fn.call({birth:2000}, year);
    }
};
obj.getAge(2017);  // 27
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 函數(shù) 1.JavaScript允許傳入任意個(gè)參數(shù)而不影響調(diào)用,因此傳入的參數(shù)比定義的參數(shù)多也沒(méi)有問(wèn)題,雖然函數(shù)內(nèi)部...
    wyude閱讀 217評(píng)論 0 1
  • 函數(shù)就是最基本的一種代碼抽象的方式。 定義函數(shù)function abs(x) {if (x >=0){return...
    _我和你一樣閱讀 516評(píng)論 0 0
  • 工廠模式類(lèi)似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡(jiǎn)單...
    舟漁行舟閱讀 8,131評(píng)論 2 17
  • 單例模式 適用場(chǎng)景:可能會(huì)在場(chǎng)景中使用到對(duì)象,但只有一個(gè)實(shí)例,加載時(shí)并不主動(dòng)創(chuàng)建,需要時(shí)才創(chuàng)建 最常見(jiàn)的單例模式,...
    Obeing閱讀 2,320評(píng)論 1 10
  • 我以為很多東西 早已遺忘 原來(lái)從不曾忘記 觸景變會(huì)生情 猶記得上學(xué)路上 家門(mén)口 一直凝望的您 也不曾忘記 殷殷等待...
    逐風(fēng)逐你閱讀 246評(píng)論 0 0

友情鏈接更多精彩內(nèi)容