JavaScript中的 this 是一個非常重要的概念,它指向當前執行上下文的對象。由于JavaScript是一門動態語言,this 的指向在運行時才能確定,可能會因為調用方式和執行環境的不同而有所變化。

this 的指向可以通過四種調用方式來決定:

  • 作為函數調用時,this 指向全局對象(瀏覽器中為window對象,Node.js中為 global 對象)。
  • 作為方法調用時,this 指向調用該方法的對象。
  • 使用 call()apply() 方法調用時,this指向第一個參數傳入的對象。
  • 使用new關鍵字調用構造函數時,this指向新創建的對象。

除了上述四種方式,還有一些特殊情況需要注意,例如箭頭函數中的 this 指向是定義函數時的上下文,不會隨著調用環境的改變而改變。

總之,JavaScript中的this是一個非常靈活和有用的概念,可以根據不同的調用方式來決定其指向,需要開發者在實際開發中靈活應用。

舉一個具體的例子,假設有一個對象 person,它有兩個方法 sayHellointroduce

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 指向全局對象,因為函數調用是在全局上下文中執行的。由于全局對象并沒有 nameage 屬性,所以輸出結果為 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,而非全局對象。