微信登录

对象 - 方法定义 - 方法中的 this 指向问题

对象 - 方法定义 - 方法中的 this 指向问题

在 JavaScript 的世界里,对象和方法是两个非常重要的概念。而在方法定义过程中,this 指向问题常常让开发者们感到困惑。接下来,我们就一起揭开 this 指向问题的神秘面纱。

方法定义

在 JavaScript 中,方法其实就是对象的属性,只不过这个属性的值是一个函数。下面是一个简单的例子:

  1. const person = {
  2. name: '小明',
  3. // 定义一个方法
  4. sayHello: function() {
  5. console.log(`你好,我是 ${this.name}`);
  6. }
  7. };
  8. person.sayHello();

在这个例子中,sayHello 就是 person 对象的一个方法。当我们调用 person.sayHello() 时,它会输出 “你好,我是 小明”。这里的 this 看起来指向了 person 对象。但事情并没有这么简单,this 的指向是动态变化的。

this 指向的不同情况

1. 全局作用域

在全局作用域中,this 指向全局对象。在浏览器环境中,全局对象就是 window 对象。

  1. console.log(this === window);

这段代码会输出 true,说明在全局作用域里,this 就是 window 对象。

2. 函数作为对象的方法调用

当函数作为对象的方法调用时,this 指向调用该方法的对象。就像我们前面的 person.sayHello() 例子,this 指向 person 对象。

3. 函数作为普通函数调用

当函数作为普通函数调用时,在严格模式下,thisundefined;在非严格模式下,this 指向全局对象。

  1. function showThis() {
  2. console.log(this);
  3. }
  4. showThis();

在非严格模式下,这段代码会输出 window 对象。

4. 构造函数调用

当使用 new 关键字调用函数时,这个函数就成为了构造函数,this 指向新创建的对象。

  1. function Person(name) {
  2. this.name = name;
  3. this.sayName = function() {
  4. console.log(this.name);
  5. };
  6. }
  7. const newPerson = new Person('小红');
  8. newPerson.sayName();

这里的 this 指向了新创建的 newPerson 对象。

总结表格

调用场景 this 指向
全局作用域 全局对象(浏览器中为 window
函数作为对象的方法调用 调用该方法的对象
函数作为普通函数调用(非严格模式) 全局对象(浏览器中为 window
函数作为普通函数调用(严格模式) undefined
构造函数调用 新创建的对象

解决 this 指向问题的方法

有时候,我们希望 this 指向特定的对象,这时可以使用 callapplybind 方法。

  1. const person1 = { name: '小李' };
  2. const person2 = { name: '小张' };
  3. function introduce() {
  4. console.log(`我是 ${this.name}`);
  5. }
  6. introduce.call(person1);
  7. introduce.apply(person2);
  8. const boundIntroduce = introduce.bind(person1);
  9. boundIntroduce();

通过 callapplybind 方法,我们可以手动指定 this 的指向。

JavaScript 中方法定义里的 this 指向问题虽然复杂,但只要我们清楚不同的调用场景和解决方法,就能轻松应对。希望通过这篇文章,你能对 this 指向问题有更深入的理解。

对象 - 方法定义 - 方法中的 this 指向问题