JavaScript 中 this 指向問題 (普通函式, 箭頭函式)
阿新 • • 發佈:2022-03-02
普通函式
- 誰呼叫了函式,那麼這個函式中的 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
- 匿名函式中的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
箭頭函式
- 箭頭函式中的 this 在定義函式時就已經被確認了,而不是在函式呼叫的時候確認的;
- 箭頭函式中的 this
- 箭頭函式無法使用 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