ES6標準新增了一種新的函數:ArrowFunction(箭頭函數)
它用箭頭定義
x => x * x
相當於
function (x) { return x * x; }
箭頭函數相當於匿名函數,並且簡化了函數定義
箭頭函數有兩種格式,一種像上面的,只包含一個表達式,連{ … }和return都省略掉了
還有一種可以包含多條語句,這時候就不能省略{ … }和return
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;
}
如果要返回一個對象,就要注意,如果是單表達式,這麼寫的話會報錯
var a=x => { foo: x } ;//這一步不會報錯
a(1).foo
TypeError: a(...) is undefined
因爲和函數體的{ … }有語法衝突,所以要改爲
var a= x => ({ foo: x })
a(1).foo
1
箭頭函數看上去是匿名函數的一種簡寫,但實際上,箭頭函數和匿名函數有個明顯的區別
箭頭函數內部的this是詞法作用域,由上下文確定
回顧前面的例子,由於JavaScript函數對this綁定的錯誤處理,下面的例子無法得到預期結果
var obj = {
birth: 2000,
getAge: function () {
var fn = function () {
return new Date().getFullYear() - this.birth; };
return fn(); }
};
obj.getAge()
NaN
因爲只有在obj的方法裏的最外層函數this指向對象,方法裏的函數指向window(undefined)
箭頭函數完全修復了this的指向,this總是指向詞法作用域,也就是外層調用者obj
var obj = {
birth: 2000,
getAge: function () {
var fn = () => new Date().getFullYear() - this.birth; return fn(); }
};
obj.getAge()
20
由於this在箭頭函數中已經按照詞法作用域綁定了,所以,用call()或者apply()調用箭頭函數時,無法對this進行綁定,即傳入的第一個參數被忽略
var obj = {
birth: 2000,
getAge: function () {
var fn = () => new Date().getFullYear()- this.birth;
return fn.apply(window); …
obj.getAge()
20
本來把this綁定到window會返回NaN,但這裏正常返回,說明無效