JavaScript中的箭頭函數(shù)詳解

什么是箭頭函數(shù)?

ES6標(biāo)準(zhǔn)新增了一種新的函數(shù):Arrow Function(箭頭函數(shù))。箭頭函數(shù)相當(dāng)于匿名函數(shù),并且簡化了函數(shù)定義。
箭頭函數(shù)的語法

(parameters) => { statements }

舉一個常規(guī)的例子

// 使用常規(guī)語法定義函數(shù)
function funcName(params) {
   return params * 3;
 }
funcName(1);
// 3

// 使用箭頭函數(shù)定義函數(shù)
var funcName = (params) => params * 3
funcName(1);
// 3

可以清晰得看到,只須一行代碼就可以搞定一個函數(shù),簡化了函數(shù)定義,書寫匿名函數(shù)的時候更加方便,在代碼書寫過程中多處可以使用到箭頭函數(shù)。

語法解析

// 通用語法
(parameters) => { statements }
// 只有一個參數(shù)時,可以省略小括號
parameters => { statements }
// 沒有參數(shù)時,簡化為
() => {statements }
// 返回值只有一個表達(dá)式時,可以省略大括號
parameters => expression

//特殊例子,返回帶有大括號的單表達(dá)式
x => { foo: x }  // error
x => ({ foo: x }) // 加上小括號,ok

沒有局部this的綁定

和一般的函數(shù)不同,箭頭函數(shù)不會綁定this。 或則說箭頭函數(shù)不會改變this本來的綁定。
下面舉個例子

function Counter() {
  this.num = 0;
  this.timer = setInterval(function add() {
    this.num++;
    console.log(this.num);
  }, 1000);
}

var b = new Counter();
// NaN
// NaN
// NaN
// ...

上述代碼是使用常規(guī)函數(shù)定義,setInterval是一個普通函數(shù),而且沒有bind、call、apply等,所以內(nèi)部的this指向的是全局this,全局this沒有num這個屬性,從而這邊輸出的都是NaN。要解決這個問題有多種方法,可以先將Counter函數(shù)的this用一個參數(shù)保存起來,在setInterval函數(shù)內(nèi)部調(diào)用這個參數(shù);也可以為setInterval綁定一個this,通過bind實現(xiàn)。在這邊,我們考慮使用箭頭函數(shù)來解決這個問題,看看下面的代碼:

function Counter() {
  this.num = 0;
  this.timer = setInterval(() => {
    this.num++;
    console.log(this.num);
  }, 1000);
}

var b = new Counter();
// 1
// 2
// 3
// ...

因為箭頭函數(shù)不會改變this本來的綁定,所以在上述代碼中通過Counter構(gòu)造函數(shù)綁定的this將會被保留。在setInterval函數(shù)中,this依然指向我們新創(chuàng)建的b對象。

通過上述的描述,我們可以知道箭頭函數(shù)沒有局部this的綁定,所以我們使用箭頭函數(shù)來實現(xiàn)React的事件處理。參考:《React事件處理》

總結(jié)

箭頭函數(shù)有兩個突出的優(yōu)點:

  • 語法簡單,簡化函數(shù)定義
  • 不會改變this的綁定
?著作權(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)容

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