首頁  >  文章  >  web前端  >  JavaScript箭頭函數的用法介紹

JavaScript箭頭函數的用法介紹

巴扎黑
巴扎黑原創
2017-08-16 11:05:253031瀏覽
本文我們介紹箭頭(arrow)函數的優點。

更簡潔的語法

#我們先來依照常規語法定義函數:
function funcName(params) {
return params + 2;
}
funcName(2);
// 4
函數使用箭頭函數可以使用僅僅一行程式碼搞定!
var funcName = (params) => params + 2
funcName(2);
// 4
是不是很酷!雖然是一個極端簡潔的例子,但很好的表達了箭頭函數在寫程式碼時的優勢。我們來深入了解箭頭函數的語法:
[code ](parameters) => { statements }[/code]如果沒有參數,那麼可以進一步簡化:
() => { statements }
如果只有一個參數,可以省略括號:
parameters => { statements }
如果傳回值隻隻有一個表達式(expression), 也可以省略大括號:
parameters => expression
 
// 等价于:
function (parameters){
return expression;
}
現在你已經學會了箭頭函數的語法,我們來實戰一下。開啟Chrome瀏覽器開發者控制台,輸入:
var double = num => num * 2
我們將變數double綁定到一個箭頭函數,該函數有一個參數num, 傳回 num * 2。 呼叫函數:
double(2);
// 4
 
double(3);
// 6
沒有局部this的綁定
和一般的函數不同,箭頭函數不會綁定this。 或則說箭頭函數不會改變this本來的綁定。
我們用一個例子來說明:

function Counter() {
this.num = 0;
}
var a = new Counter();

因為使用了關鍵字new構造,Count()函數中的this綁定到一個新的對象,並且賦值給a。透過console.log印出a.num,會輸出0。

console.log(a.num);
// 0

如果我們想要每過一秒將a.num的值加1,該如何實現呢?可以使用setInterval()函數。
function Counter() {
this.num = 0;
this.timer = setInterval(function add() {
this.num++;
console.log(this.num);
}, 1000);
}

我們來看看輸出結果:
var b = new Counter();
// NaN
// NaN
// NaN
// ..
你會發現,每隔一秒都會有一個NaN列印出來,而不是累加的數字。到底哪裡錯了呢?
首先使用以下語句停止setInterval函數的連續執行:

clearInterval(b.timer);
我們來試著理解為什麼出錯:根據上一篇部落格講解的規則,首先函數setInterval沒有被某個宣告的對象調用,也沒有使用new關鍵字,再之沒有使用bind, call和apply。 setInterval只是一個普通的函數。實際上setInterval裡面的this綁定到全域物件的。我們可以透過將this列印出來驗證這一點:
function Counter() {
this.num = 0;
this.timer = setInterval(function add() {
console.log(this);
}, 1000);
}
var b = new Counter();
你會發現,整個window物件被印出來。 使用以下指令停止列印:
clearInterval(b.timer);

回到先前的函數,之所以列印NaN,是因為this.num綁定到window物件的num,而window.num未定義。
那麼,我們要如何解決這個問題呢?使用箭頭函數!使用箭頭函數就不會導致this被綁定到全域物件。
function Counter() {
this.num = 0;
this.timer = setInterval(() => {
this.num++;
console.log(this.num);
}, 1000);
}
var b = new Counter();
// 1
// 2
// 3
// ...
透過Counter建構函數綁定的this將會被保留。在setInterval函數中,this仍指向我們新建立的b物件。
為了驗證剛剛的說法,我們可以將 Counter函數中的this綁定到that, 然後在setInterval中判斷this和that是否相同。
function Counter() {
var that = this;
this.timer = setInterval(() => {
console.log(this === that);
}, 1000);
}
var b = new Counter();
// true
// true
// ...

正如我們所期望的,列印值每次都是true。最後,結束刷屏的列印:
clearInterval(b.timer);

總結
  1. 箭頭函數寫程式具有更簡潔的語法;

  2. 不會綁定this。

以上是JavaScript箭頭函數的用法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn