# 深入理解JavaScript中的`this`关键字

![01H8BC92WZ7X9QNA73VXYGVQTQ](https://just-blog.oss-cn-hangzhou.aliyuncs.com/images/01H8BC92WZ7X9QNA73VXYGVQTQ.png)![01H8BC92WZ7X9QNA73VXYGVQTQ](https://just-blog.oss-cn-hangzhou.aliyuncs.com/images/01H8BC92WZ7X9QNA73VXYGVQTQ.png)

JavaScript中的`this`是一个特殊的关键字,无论在哪个函数中,它都可以被使用。然而,`this`的值并非固定不变,而是依据函数的调用方式,也就是所谓的执行上下文(execution context),有所不同。今天,我们将就不同的执行上下文,深入探讨`this`关键字。

首先,让我们看看以下的JavaScript函数:

Language
Copy code
```javascript function test() { console.log(this) } ```

在这个`test`函数中,`this`的值到底是什么呢?

## 全局上下文

如果函数直接在全局上下文中被调用,`this`通常会指向全局对象。在浏览器环境中,这个全局对象就是`window`

Language
Copy code
```javascript test(); // `this` inside `test` refers to `window` in browsers, `global` in Node.js ```

在上述例子中,函数`test`在全局上下文中被直接调用,因此`this`指向全局对象。

## 对象方法上下文

如果函数作为对象的一个方法被调用,那么`this`将会指向调用这个方法的对象。

Language
Copy code
```javascript let obj = { method: test }; obj.method(); // `this` inside `method` (which is `test`) refers to `obj` ```

在这个例子中,我们将函数`test`赋值给对象`obj`的一个属性`method`,并通过`obj.method()`来调用它。这样,`this`就会指向`obj`

## 构造函数上下文

当函数被当作一个构造函数使用,即通过`new`关键字创建新的对象实例时,`this`将会指向新创建的对象。

Language
Copy code
```javascript let NewObj = test; let instance = new NewObj(); // `this` inside `test` refers to the new instance of `NewObj` ```

在这个例子中,我们用函数`test`作为构造函数`NewObj`来创建一个新的对象`instance`。因此,`this`将会指向新创建的对象`instance`

## 显式/隐式绑定上下文

通过`.call()`, `.apply()`, 或 `.bind()`方法调用函数时,我们可以显式地设定`this`的值。

Language
Copy code
```javascript let anotherObj = { name: 'Another object' }; test.call(anotherObj); // `this` inside `test` refers to `anotherObj` ```

这里,我们使用了`call`方法来调用`test`函数,并显式地将`this`绑定到`anotherObj`上。

然而,值得注意的是,`this`的行为可能会在严格模式和箭头函数中发生变化。在严格模式下,全局函数和未命名的对象方法中的`this`将是`undefined`。箭头函数则不会创建自己的`this`

下文,而是会继承自包含它的函数的`this`

在理解了这些基本概念之后,你就能更灵活、更深入地理解和使用JavaScript的`this`关键字了。希望这篇文章能帮助你在JavaScript编程中,更好地掌握`this`的用法。