傳統函式 VS 箭頭函式


傳統函式的 this 問題

傳統函式中 this 的指向是隨著呼叫的方式不同而定


    const Ming = {
        myName: '小明',
        friends: ['漂亮阿姨', '杰倫', '小美'],
        getFriends() {
        this.friends.forEach(function(friend) {
            console.log(`${friend}${this.myName} 的朋友`);
        });
        }
    }
    Ming.getFriends();

    //漂亮阿姨 是 undefined 的朋友
    //杰倫 是 undefined 的朋友
    //小美 是 undefined 的朋友

第一個 this 指向了呼叫 getFriends() 的 Ming
而第二個 this 則指向了外層的 callback function 而轉為 全域,所以最終的都列出 undefined 的結果。

箭頭函式

箭頭函式最大的特點就是沒有自己的 this,因此當箭頭函式中出現了 this ,它則會指向外層的作用域所對應的 this。
因為箭頭函式沒有自己的 this,所以要找到箭頭函式的 this 指向時,可直接參考其外層作用域的 this 指向


    const Ming = {
        myName: '小明',
        friends: ['漂亮阿姨', '杰倫', '小美'],
        getFriends() {
        this.friends.forEach(friend => {
            console.log(`${friend}${this.myName} 的朋友`);
        });
        }
    }
    Ming.getFriends();

    //漂亮阿姨 是 小明 的朋友
    //杰倫 是 小明 的朋友
    //小美 是 小明 的朋友

    var Ming = {
        myName: '小明',
        family: {
        myName: '小明家',
        fn: ()=> {
            console.log(this.myName);
        }
        }
    };
    Ming.family.fn();

    //雖然物件有多個層級,但在此也是直接查找最外層的最用域 this 指向全域

特例


    (function () {
        var myName = '立即函式作用域';
        var Ming = {
        myName: '小明',
        fn:() => {
            console.log(this.myName);
        }
        };
        Ming.fn();
    })();

    //立即函式的 this 與全域相同
    //result : undefined

箭頭函式使用注意 :
1.物件內的屬性方法避免使用箭頭函式定義
2.箭頭函式外層的函式越單純越好,避免過度巢狀
3.當使用箭頭函式,請先確認外層的 this 指向

An unhandled error has occurred. Reload 🗙