浅谈JavaScript的this指针

本文最后更新于:2023年8月21日 上午

JavaScript 中的 this 是一个非常重要的概念,它用来引用当前执行上下文中的对象。在 JavaScript 中,this 的值是根据函数的调用方式而动态确定的。在不同的情况下,this 可能会指向不同的对象,或者根本不指向任何对象。

JavaScript 中 this 的值可以通过以下四种方式来确定:

  1. 默认绑定:如果一个函数是直接调用的,则 this 的值将会是全局对象。在浏览器中,全局对象就是 window 对象。

  2. 隐式绑定:当一个函数作为对象的方法被调用时,this 的值将会是调用该方法的对象。

  3. 显式绑定:使用 call()apply() 或者 bind() 方法来显式地绑定 this 的值。这些方法可以让我们指定函数在执行时所需要的上下文对象。

  4. new 绑定:当一个函数用 new 关键字被调用时,将创建一个新的对象,并将该对象作为 this 的值。此时,函数内部的 this 指向新创建的对象。

除了以上四种方式,this 的值还可能受到箭头函数的影响。箭头函数不会改变 this 的值,它会继承当前上下文中的 this 值。

下面我们通过例子来进一步说明 this 的使用方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 默认绑定
function foo() {
console.log(this); // window
}
foo();

// 隐式绑定
const obj = {
name: "Alice",
sayName() {
console.log(this.name);
}
};
obj.sayName(); // "Alice"

// 显式绑定
function bar() {
console.log(this.name);
}
const person = {
name: "Bob"
};
bar.call(person); // "Bob"

// new 绑定
function Person(name) {
this.name = name;
}
const alice = new Person("Alice");
console.log(alice.name); // "Alice"

// 箭头函数
const baz = () => {
console.log(this); // window
};
baz();

通过上述例子,我们可以看到不同绑定方式下 this 的值是如何变化的。

需要注意的是,在严格模式下,函数的默认绑定将会返回 undefined 而不是全局对象。此外,在使用 call() 或者 apply() 方法时,如果第一个参数不是一个对象,则会先将其转换为一个对象。在使用 bind() 方法时,它将返回一个新的函数,我们需要将其保存到变量中并在需要的时候调用。


浅谈JavaScript的this指针
https://blog.xuven.xyz/post/ThisForJavascript/
作者
Xuven Li
发布于
2023年3月21日
许可协议