1. 程式人生 > 其它 >JavaScript 中 this 指向問題 (普通函式, 箭頭函式)

JavaScript 中 this 指向問題 (普通函式, 箭頭函式)

普通函式

  1. 誰呼叫了函式,那麼這個函式中的 this 就指向誰.
let myFun = function() {
    console.log(this);
}
let obj = {
    name: "趙雲",
    myFun: function() {
        console.log(this);
    }
}

// 這裡的this之所以指向window物件,是因為myFun函式是由window在全域性作用域中呼叫的
myFun();      // window
// 這裡的this之所以指向obj物件,是因為myFun函式是由obj這個物件呼叫的
obj.myFun();  // obj
  1. 匿名函式中的this指向:匿名函式的執行具有全域性性,則匿名函式中的 this 指向是 window, 而不是呼叫這個匿名函式的物件.
let obj = {
    name: "趙雲",
    myFun: function() {
        return function() {
            console.log(this);
        }
    }
}
obj.myFun()();    // window

上面的程式碼中,myFun 方法是由 obj 物件呼叫的,但是 obj.myFun() 返回的是一個匿名函式,而匿名函式中的 this 指向 window

,所以列印 window;
如果上面的程式碼中使 this 指向呼叫這個方法的物件,可以提前把 this 傳值給另一個變數(_this);

let obj = {
    name: "趙雲",
    myFun: function() {
        let _this = this;
        return function() {
            console.log(_this);
        }
    }
}
obj.myFun()();    // obj

箭頭函式

  1. 箭頭函式中的 this 在定義函式時就已經被確認了,而不是在函式呼叫的時候確認的;
  2. 箭頭函式中的 this
    指向父級作用域的執行上下文;(解釋:JavaScript 中除了全域性作用域,其他作用域都是由函式創建出來的,如果想確認 this 指向,則找到離箭頭函式最近的function,與這個function平級的執行上下文中的 this 就是箭頭函式中的 this);
  3. 箭頭函式無法使用 call, bind, apply改變 this 指向,是因為 this 在函式定義的時候已經被確認;

舉例一:距離箭頭函式最近的函式是 myFun,與這個函式最近的上下文中 this 指向 obj, 所以箭頭函式中 this 的指向為 obj

let obj = {
    name: "趙雲",
    // 這裡的this指向就是箭頭函式中this的指向
    myFun: function() {
        return () => {
            console.log(this);
        }
    }
}
obj.myFun()();    // obj

舉例二: 這段程式碼中存在兩個箭頭函式,this 找不到離它最近的函式作用域,所以一直往上找指向 window;

let obj = {
    name: "趙雲",
    myFun: () => {
        return () => {
            console.log(this);
        }
    }
}
obj.myFun()();    // window