JS:箭頭函數(shù)(ES6標(biāo)準(zhǔn))

Arrow Function(箭頭函數(shù))。

ES6標(biāo)準(zhǔn)新增了一種新的函數(shù):Arrow Function(箭頭函數(shù))。

為什么叫Arrow Function?因為它的定義用的就是一個箭頭

一、寫法之一:

x => x * x

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

function (x) {
    return x * x;
}

在繼續(xù)學(xué)習(xí)箭頭函數(shù)之前,請測試你的瀏覽器是否支持ES6的Arrow Function

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

箭頭函數(shù)相當(dāng)于匿名函數(shù),并且簡化了函數(shù)定義。

二、寫法之二:

箭頭函數(shù)有兩種格式:

一種像上面的,只包含一個表達式,連{ ... }和return都省略掉了。
還有一種可以包含多條語句,這時候就不能省略{ ... }和return:

x => {
    if (x > 0) {
        return x * x;
    }
    else {
        return - x * x;
    }
}
如果參數(shù)不是一個,就需要用括號()括起來:
// 兩個參數(shù):
(x, y) => x * x + y * y

// 無參數(shù):
() => 3.14

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

如果要返回一個對象,就要注意,如果是單表達式,這么寫的話會報錯:

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

因為和函數(shù)體的{ ... }有語法沖突,所以要加括號

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

三、this

箭頭函數(shù)看上去是匿名函數(shù)的一種簡寫,但實際上,箭頭函數(shù)和匿名函數(shù)有個明顯的區(qū)別:箭頭函數(shù)內(nèi)部的this是詞法作用域,由上下文確定。

回顧前面的例子,由于JavaScript函數(shù)對this綁定的錯誤處理,下面的例子無法得到預(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對象
        return fn();
    }
};
obj.getAge(); // 27

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

var that = this;

就不再需要了。

由于this在箭頭函數(shù)中已經(jīng)按照詞法作用域綁定了,所以,用call()或者apply()調(diào)用箭頭函數(shù)時,無法對this進行綁定,即傳入的第一個參數(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(2015); // 25
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點點福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運大...
    HetfieldJoe閱讀 2,995評論 0 16
  • 函數(shù)參數(shù)的默認值 基本用法 在ES6之前,不能直接為函數(shù)的參數(shù)指定默認值,只能采用變通的方法。 上面代碼檢查函數(shù)l...
    呼呼哥閱讀 3,703評論 0 1
  • 本文是大神廖雪峰的JavaScript教程學(xué)習(xí)筆記。并不是教程,如有需要,請前往廖雪峰大神大博客. 一、函數(shù)定義和...
    0o凍僵的企鵝o0閱讀 570評論 1 3
  • 函數(shù)函數(shù)定義與調(diào)用變量作用域全局變量方法高階函數(shù)閉包箭頭函數(shù)$generator$ 函數(shù) 函數(shù)定義與調(diào)用 定義函數(shù)...
    染微言閱讀 687評論 0 5
  • 昨天在普明禪院拜佛的時候,聽到了自己的聲音:臣服于你的心,跪拜時內(nèi)心充滿法喜,看著各種面目猙獰的羅漢,內(nèi)心卻很喜悅...
    竺子閱讀 332評論 0 1

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