箭頭函數中的this

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入門之函數的擴展

發佈了32 篇原創文章 · 獲贊 6 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章