箭頭函數
箭頭函數是什麼
- ES6標準新增了一種新的函數:Arrow Function(箭頭函數)
箭頭函數分類邊界
- 只包含一個表達式,連
{ ... }
和return
都省略掉了
x => x * x
上面的箭頭函數相當於
function (x) {
return x * x;
}
- 包含多條語句,不能省略
{ ... }
和return
:
多條語句條件
如果參數爲一個
// x爲參數
x => {
if (x > 0) {
return x * x;
}
else {
return - x * x;
}
}
如果參數不是一個,就需要用括號()
括起來
// 兩個參數
(x, y) => x * x + y * y
// 無參數
() => 3.14
// 可變參數
(x, y, ...rest) => {
var i, sum = x + y;
for (i = 0; i < rest.length; i++) {
sum += rest[i];
}
return sum;
}
如果要返回一個對象,就要注意,如果是單表達式,這麼寫的話會報錯
// SyntaxError:
x => { foo: x }
因爲和函數體的{ ... }
有語法衝突,所以要改爲
// ok:
x => ({ foo: x })
目的
箭頭函數相當於匿名函數,並且簡化了函數定義
組合
this
箭頭函數看上去是匿名函數的一種簡寫,但實際上,箭頭函數和匿名函數有個明顯的區別
- 箭頭函數內部的
this
是詞法作用域,由上下文確定 - 匿名函數
this
指向window
中的全局變量,若無則爲undefined
回顧前面的例子,由於JavaScript函數對this
綁定的錯誤處理,下面的例子無法得到預期結果
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();
}
};
現在,箭頭函數完全修復了this
的指向,this
總是指向詞法作用域,也就是外層調用者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(); // 25
如果使用箭頭函數,以前的那種hack寫法
var that = this;
就不再需要了
由於this
在箭頭函數中已經按照詞法作用域綁定了,所以,用call()
或者apply()
調用箭頭函數時,無法對this
進行綁定,即傳入的第一個參數被忽略
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