返回

图解 JavaScript 中的 this 指向:简单易懂,再无困惑!

前端

JavaScript 中的 this 指向一直是一个让许多开发者头疼的问题。this 指向会随着函数的调用方式和上下文而变化,这使得理解和使用起来变得复杂。

为了让大家轻松理解 this 指向,我们准备了两张图,以直观的方式解释 this 在不同情况下的指向。

第一张图:函数调用方式对 this 指向的影响

// 全局调用
function globalFunc() {
  console.log(this); // 指向 window 对象
}

// 对象方法调用
const obj = {
  name: 'obj',
  objFunc() {
    console.log(this); // 指向 obj 对象
  }
};

// 构造函数调用
function Person(name) {
  this.name = name;
  this.personFunc = function() {
    console.log(this); // 指向 Person 实例
  };
}

// 箭头函数调用
const arrowFunc = () => {
  console.log(this); // 指向 window 对象
};

在第一张图中,我们展示了四种常见的函数调用方式,并说明了每种调用方式下 this 指向的对象。

  • 全局调用: 当函数以全局方式调用时,this 指向 window 对象。
  • 对象方法调用: 当函数作为对象的方法调用时,this 指向该对象本身。
  • 构造函数调用: 当函数作为构造函数调用时,this 指向新创建的对象实例。
  • 箭头函数调用: 箭头函数没有自己的 this 指向,它总是继承外层函数的 this 指向。

第二张图:上下文对 this 指向的影响

// 嵌套函数调用
function outerFunc() {
  const innerFunc = function() {
    console.log(this); // 指向 window 对象
  };
  innerFunc();
}

// bind() 方法改变 this 指向
const obj = {
  name: 'obj'
};
const boundFunc = function() {
  console.log(this); // 指向 obj 对象
}.bind(obj);
boundFunc();

// call() 和 apply() 方法改变 this 指向
function func() {
  console.log(this); // 指向 obj 对象
}
func.call(obj);
func.apply(obj);

在第二张图中,我们展示了上下文对 this 指向的影响。

  • 嵌套函数调用: 当一个函数嵌套在另一个函数中时,内部函数的 this 指向与外部函数的 this 指向相同。
  • bind() 方法: bind() 方法可以改变函数的 this 指向,使其指向指定的对象。
  • call() 和 apply() 方法: call() 和 apply() 方法也可以改变函数的 this 指向,使其指向指定的对象。

通过这两张图,您应该已经对 JavaScript 中的 this 指向有了一个清晰的理解。如果您还有任何疑问,请随时留言,我会尽力解答。