一天一个前端知识点(16):JavaScript 中的 this 如何使用?

24 阅读1分钟

在 JavaScript 中,this 关键字用于指代当前执行代码的对象。this 的值在每次函数调用时都可能不同,它的具体值取决于函数被调用的方式。

常见的使用方式:

  1. 作为对象方法调用时,this 指代该对象:
const obj = {
  name: 'Alice',
  greet() {
    console.log(`Hello, my name is ${this.name}.`);
  }
};

obj.greet(); // 输出 "Hello, my name is Alice."

  1. 作为构造函数调用时,this 指代新创建的对象:
function Person(name) {
  this.name = name;
  this.greet = function() {
    console.log(`Hello, my name is ${this.name}.`);
  };
}

const alice = new Person('Alice');
alice.greet(); // 输出 "Hello, my name is Alice."

  1. 作为函数调用时,this 指代全局对象(在浏览器中是 window,在 Node.js 中是 global):
function sayHello() {
  console.log(`Hello, my name is ${this.name}.`);
}

const name = 'Alice';
sayHello(); // 输出 "Hello, my name is undefined."(因为全局对象中没有 name 属性)

  1. 通过 apply() 或 call() 方法调用时,this 指代传入的对象
const obj1 = { name: 'Alice' };
const obj2 = { name: 'Bob' };

function greet() {
  console.log(`Hello, my name is ${this.name}.`);
}

greet.call(obj1); // 输出 "Hello, my name is Alice."
greet.apply(obj2); // 输出 "Hello, my name is Bob."

  1. 作为箭头函数的 this 始终指向函数定义时的 this:
const obj = {
  name: 'Alice',
  greet: function() {
    const sayHello = () => {
      console.log(`Hello, my name is ${this.name}.`);
    };
    sayHello();
  }
};

obj.greet(); // 输出 "Hello, my name is Alice."

需要注意的是,在严格模式下,函数作为函数调用时,this 的值为 undefined,而不是全局对象。此外,在使用 this 时,应当注意避免出现 this 绑定丢失的情况,即 this 的值不是预期的对象,这通常是由于函数的调用方式不正确导致的。为了避免 this 绑定丢失,可以使用 bind()、apply() 或 call() 等方法来显式地指定函数执行时的 this 值。