this的指向有哪几种?一个文章让你理解明白!从此不在为this指向犯愁!

本文详细介绍了JavaScript中this的五种不同指向:全局对象、隐式绑定、显式绑定(call、apply、bind)、new绑定以及箭头函数的绑定。通过示例代码展示了在不同场景下this的指向规则,帮助理解this的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

this的指向有以下几种:

1.全局对象:如果this位于函数外,this指向全局对象(window)。

console.log(this); // 输出全局对象 window

2.隐式绑定:如果this位于函数内,并且函数在对象内部调用,this指向调用该函数的对象。

const obj = {
  name: 'Alice',
  sayHi() {
    console.log(this.name);
  }
};

obj.sayHi(); // 输出 Alice

3.显式绑定:使用call、apply、bind方法,在调用函数时手动绑定this的指向。

function sayHi() {
  console.log(`Hi, ${this.name}`);
}

const obj1 = {
  name: 'Alice',
};

const obj2 = {
  name: 'Bob',
};

sayHi.call(obj1); // 输出 Hi, Alice 
sayHi.call(obj2); // 输出 Hi, Bob
在这个示例代码中,我们定义了一个sayHi函数,它在函数内部使用了this关键字。然后,我们又定义了两个对象obj1和obj2,其中都有一个name属性,但是这两个对象并不是说Hi的对象。我们可以使用call方法,将sayHi函数内部的this指向指定为obj1或obj2对象,从而让sayHi函数输出不同的结果。在使用call方法时,我们需要将要绑定this的对象作为call方法的第一个参数传入,剩余的参数则是原函数接收的参数。

4.new绑定:使用new调用构造函数时,this指向新创建的实例对象。

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

const john = new Person('John', 25);

console.log(john.name); // 输出 "John"
console.log(john.age); // 输出 25
在上面的例子中,我们声明了一个构造函数 Person,它有两个参数 name 和 age,并且通过使用 this 关键字将这些参数赋值给了新创建的实例对象。接下来,我们使用 new 关键字调用了该构造函数,这样 this 就指向了新创建的实例对象 john。最终,我们通过输出 john.name 和 john.age 验证了这一点。

5.箭头函数绑定:箭头函数的this指向不会改变,它会“捕获”上下文中的this值,指向箭头函数声明时的作用域内的this值。

下面是一个简单的例子:

```
const obj = {
  name: 'John',
  sayName: function() {
    setTimeout(() => {
      console.log(this.name);
    }, 1000);
  }
};

obj.sayName(); // 输出 "John"
```

在上面的例子中,我们定义了一个对象 obj,对象内包含一个方法 sayName。该方法内部又包含了一个定时器,定时器回调函数使用箭头函数声明,而箭头函数内部引用了 this 关键字。由于箭头函数会“捕获”所在作用域内的 this 值,因此在定时器回调函数中,this 访问的是当前作用域内的 this 值,即 obj 对象,因此输出的结果为 "John"。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值