返回

this指向问题,前端开发的拦路虎

前端

JavaScript 中的 this 是一个特殊变量,用于表示当前执行代码的对象。它可以在函数、方法和构造函数中使用。在大多数情况下,this 的值是由函数的调用方式决定的。

1. 普通函数

在普通函数中,this 指向全局对象。全局对象是 JavaScript 中的顶级对象,它包含所有全局变量和函数。例如,以下代码中,this 指向全局对象 window

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

sayHello();

2. 箭头函数

箭头函数是一种特殊的函数语法,它没有自己的 this 值。箭头函数的 this 值总是指向它的外层函数的 this 值。例如,以下代码中,箭头函数 sayHellothis 值指向函数 outerFunctionthis 值:

function outerFunction() {
  var that = this;

  var sayHello = () => {
    console.log(this); // 输出:window
  };

  sayHello();
}

outerFunction();

3. 构造函数

构造函数是用来创建对象的函数。在构造函数中,this 指向新创建的对象。例如,以下代码中,构造函数 Personthis 值指向新创建的对象 person

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

var person = new Person('John');

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

4. 对象方法

对象方法是定义在对象上的函数。在对象方法中,this 指向该方法所属的对象。例如,以下代码中,对象 person 的方法 sayHellothis 值指向对象 person

var person = {
  name: 'John',
  sayHello: function() {
    console.log(this); // 输出:{ name: 'John' }
  }
};

person.sayHello();

5. 改变 this 指向的方法

在某些情况下,我们可能需要改变 this 的指向。我们可以使用以下方法来改变 this 的指向:

  • 使用 bind() 方法:bind() 方法可以将一个函数的 this 值绑定到另一个对象。例如,以下代码中,我们将函数 sayHellothis 值绑定到对象 person
var person = {
  name: 'John'
};

var sayHello = function() {
  console.log(this.name);
};

var boundSayHello = sayHello.bind(person);

boundSayHello(); // 输出:John
  • 使用 call()apply() 方法:call()apply() 方法也可以用来改变函数的 this 值。call() 方法接受一个参数作为 this 值,而 apply() 方法接受一个数组作为 this 值。例如,以下代码中,我们将函数 sayHellothis 值分别绑定到对象 person 和数组 ['John', 'Mary']
var person = {
  name: 'John'
};

var sayHello = function() {
  console.log(this.name);
};

sayHello.call(person); // 输出:John
sayHello.apply(person, ['John', 'Mary']); // 输出:John

结论

this 关键字是 JavaScript 中一个非常重要的概念。它可以在函数、方法和构造函数中使用。在大多数情况下,this 的值是由函数的调用方式决定的。但是,我们也可以使用 bind()call()apply() 方法来改变 this 的指向。