返回

关于this指向问题的综合梳理

前端

this指向问题是JavaScript中一个常见的问题,它会影响到代码的执行结果。本文将对this指向问题进行全面的梳理和总结,帮助读者理解和掌握this指向问题。

作为普通函数调用

当一个函数作为普通函数调用时,this指向window对象。例如:

function foo() {
  console.log(this);
}

foo(); // 输出:window

绑定事件的函数

当一个函数被绑定到事件上时,this指向触发事件的元素。例如:

document.getElementById("btn").addEventListener("click", function() {
  console.log(this);
});

当点击按钮时,this指向按钮元素。

作为对象的方法调用

当一个函数作为对象的方法调用时,this指向该对象。例如:

var obj = {
  name: "John",
  sayName: function() {
    console.log(this.name);
  }
};

obj.sayName(); // 输出:John

闭包条件下的调用

在闭包条件下,this指向函数被定义时的this值。例如:

function outer() {
  var name = "John";

  function inner() {
    console.log(this.name);
  }

  inner(); // 输出:John
}

outer();

构造函数中调用

在构造函数中,this指向新创建的对象。例如:

function Person(name) {
  this.name = name;
}

var person = new Person("John");

console.log(person.name); // 输出:John

立即执行函数中调用

在立即执行函数中,this指向window对象。例如:

(function() {
  console.log(this);
})(); // 输出:window

定时器里面的函数

在定时器里面的函数中,this指向window对象。例如:

setTimeout(function() {
  console.log(this);
}, 1000); // 输出:window

箭头函数

箭头函数没有自己的this值,它会继承外层函数的this值。例如:

var obj = {
  name: "John",
  sayName: () => {
    console.log(this.name);
  }
};

obj.sayName(); // 输出:undefined

call、apply、bind方法

call、apply、bind方法可以改变函数的this值。例如:

function foo() {
  console.log(this.name);
}

var obj = {
  name: "John"
};

foo.call(obj); // 输出:John
foo.apply(obj); // 输出:John
var boundFoo = foo.bind(obj);
boundFoo(); // 输出:John

结论

this指向问题是JavaScript中一个常见的问题,它会影响到代码的执行结果。通过本文的梳理和总结,读者可以对this指向问题有一个全面的了解和掌握。