ES6中爲我們提供了箭頭函數,使用起來非常方便:
const sum = (a,b) => a+b;
sum(2,3);//5
在箭頭函數使用中,this和其他地方的使用是不同的。
箭頭函數中的this對象是定義所在時的對象,而不是使用時所在的對象。
一般情況下,this是可變的,但是在箭頭函數中this是固定的。
//普通函數
function foo(){
setTimeout(function(){
console.log(this.id);
},100);
}
var id = 22;
foo.call({id:43});//22
//箭頭函數
function foo(){
setTimeout(() => {
console.log(this.id);
},100);
}
var id = 22;
foo.call({id:43});//43
在如上代碼中,setTimeout()函數參數是一個箭頭函數,通常情況下,setTimeout()中的this應該指向全局作用域,所以this應該指向的是window對象,結果應該是輸出22.但是由於是箭頭函數,箭頭函數導致this總是指向函數定義生效時所在的對象{id:43},所以在這裏,輸出的應該是42.
箭頭函數可以讓setTimeout裏面的this,綁定定義時所在的作用域,而不是指向運行時所在的
作用域。
箭頭函數可以讓this指向固定化,這種特性很有利於封裝回調函數。
箭頭函數this指向的固定化,並不是因爲箭頭函數內部有綁定this的機制,實際原因是箭頭函數根本沒有自己的this,導致內部的this就是外層代碼塊的this。正是因爲這個,所以箭頭函數也不能做構造函數。當然也就不能使用call,apply,bind來改變this的指向。
非常感謝:ES6入門之函數的擴展