返回

JavaScript 中的 this 指向问题及其实际应用

前端

在 JavaScript 中,this 指向问题异常重要,因为在开发中要经常用到 this。所以,我在本篇文章中将对 this 指向问题进行讲解。在讲解之前,要声明两点:

  1. this 是一个,而非保留字,因此在严格模式下,可以重新赋值。
  2. this 的指向与函数的调用方式和对象的使用方式密切相关。

this 指向的本质

this 指向的是函数执行时,内部可以访问的对象。确切地说,this 指向的是函数被调用时,所属的那个对象。

如果函数不是作为一个对象的方法被调用,则 this 指向的是全局对象(在浏览器中是 window 对象)。

this 的指向规则

1. 默认绑定

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

function sayHello() {
  console.log(this); // 输出:Window {window: Window, self: Window, document: HTMLDocument, name: "", location: Location, ...}
}

sayHello();

2. 隐式绑定

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

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

person.sayHello();

3. 显式绑定

使用 call()apply()bind() 方法可以显式地绑定 this 指向。

  • call() 方法:显式地将 this 指向指定的对象,并将参数作为单独的参数传递给函数。例如:
const person = {
  name: "John",
};

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

sayHello.call(person); // 输出:John
  • apply() 方法:与 call() 方法类似,但参数作为数组传递给函数。例如:
const person = {
  name: "John",
};

function sayHello(age) {
  console.log(this.name + ", " + age);
}

sayHello.apply(person, [25]); // 输出:John, 25
  • bind() 方法:返回一个新函数,该函数的 this 指向固定为指定的对象。例如:
const person = {
  name: "John",
};

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

const boundSayHello = sayHello.bind(person);

boundSayHello(); // 输出:John

this 指向的实际应用

1. 对象的方法

在对象的方法中,this 指向该对象本身。这使得我们可以访问对象的属性和方法。例如:

const person = {
  name: "John",
  sayHello: function () {
    console.log(this.name);
  },
};

person.sayHello(); // 输出:John

2. 事件处理程序

在事件处理程序中,this 指向触发事件的元素。例如:

const button = document.getElementById("myButton");

button.addEventListener("click", function () {
  console.log(this); // 输出:<button id="myButton">...</button>
});

3. 构造函数

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

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

const person = new Person("John");

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

4. 箭头函数

在箭头函数中,this 指向与包含它的函数相同。例如:

const person = {
  name: "John",
  sayHello: () => {
    console.log(this); // 输出:{name: "John", sayHello: ƒ}
  },
};

person.sayHello();

总结

this 指向是一个复杂但重要的概念。通过理解 this 指向的规则和实际应用,可以更好地编写 JavaScript 代码。