JavaScript中的 this 是一個非常重要的概念,它指向當前執行上下文的對象。由于JavaScript是一門動態語言,this 的指向在運行時才能確定,可能會因為調用方式和執行環境的不同而有所變化。
this 的指向可以通過四種調用方式來決定:
- 作為函數調用時,
this指向全局對象(瀏覽器中為window對象,Node.js中為global對象)。 - 作為方法調用時,
this指向調用該方法的對象。 - 使用
call()或apply()方法調用時,this指向第一個參數傳入的對象。 - 使用
new關鍵字調用構造函數時,this指向新創建的對象。
除了上述四種方式,還有一些特殊情況需要注意,例如箭頭函數中的 this 指向是定義函數時的上下文,不會隨著調用環境的改變而改變。
總之,JavaScript中的this是一個非常靈活和有用的概念,可以根據不同的調用方式來決定其指向,需要開發者在實際開發中靈活應用。
舉一個具體的例子,假設有一個對象 person,它有兩個方法 sayHello 和 introduce :
const person = {
name: "Quintion",
age: 32,
sayHello() {
console.log(`Hello, my name is ${this.name}`);
},
introduce() {
console.log(`I'm ${this.age} years old.`);
},
};
如果以方法調用的方式調用 sayHello() 和introduce():
person.sayHello(); // Hello, my name is Quintion
person.introduce(); // I'm 32 years old.
此時 this 分別指向 person 對象,因為這兩個方法是在 person 對象中定義的。
如果以函數調用的方式調用 sayHello() 和introduce():
const sayHello = person.sayHello;
const introduce = person.introduce;
sayHello(); // Hello, my name is undefined
introduce(); // I'm undefined years old.
此時 this 指向全局對象,因為函數調用是在全局上下文中執行的。由于全局對象并沒有 name 和 age 屬性,所以輸出結果為 undefined。
如果將上面的函數使用 call() 方法來調用,如下:
const sayHello = person.sayHello;
const introduce = person.introduce;
sayHello.call(person); // Hello, my name is Quintion
introduce.call(person); // I'm 32 years old.
此時 this 指向 person 對象,因為在 call() 方法的第一個參數中傳入了 person 對象。
需要注意的是,如果在嚴格模式下使用函數調用方式,
this指向的是undefined,而非全局對象。