改变this指向的几种方法

60 阅读1分钟
  1. 隐式绑定:当函数作为对象的方法被调用时,this 会隐式绑定到该对象。

    javascriptCopy code
    const obj = {
      name: "Alice",
      sayHello: function () {
        console.log(`Hello, ${this.name}`);
      },
    };
    
    obj.sayHello(); // "Hello, Alice"
    
  2. 显式绑定:使用 call()apply() 方法显式指定函数的 this

    javascriptCopy code
    function sayHello() {
      console.log(`Hello, ${this.name}`);
    }
    
    const person = { name: "Bob" };
    
    sayHello.call(person); // "Hello, Bob"
    
  3. new 关键字:当函数以构造函数的形式使用(通过 new 关键字),this 会指向新创建的对象。

    javascriptCopy code
    function Person(name) {
      this.name = name;
    }
    
    const person = new Person("Charlie");
    console.log(person.name); // "Charlie"
    
  4. 箭头函数:箭头函数的 this 始终指向包含它的最近的非箭头函数父级作用域的 this

    javascriptCopy code
    const obj = {
      name: "David",
      sayHello: () => {
        console.log(`Hello, ${this.name}`);
      },
    };
    
    obj.sayHello(); // "Hello, undefined"(箭头函数中的 this 指向全局对象)
    
  5. bind() 方法bind() 方法创建一个新函数,其中的 this 被永久绑定到指定的值。

    javascriptCopy code
    function sayHello() {
      console.log(`Hello, ${this.name}`);
    }
    
    const person = { name: "Eve" };
    const boundSayHello = sayHello.bind(person);
    
    boundSayHello(); // "Hello, Eve"
    

需要注意的是,在严格模式下(通过 "use strict" 声明),全局上下文中的 this 将为 undefined,而不是默认指向全局对象(如 window)。因此,在使用 this 时要小心,确保了解当前上下文并适当地绑定 this