非严格模式下async函数中await不改变this值,this仍由调用方式决定,直接调用时默认指向全局对象(如window)。

在非严格模式下,async 函数内部 await 执行时的 this 值,并不因 await 本身而改变——它的取值边界完全由函数调用方式决定,和普通函数一致。await 只是暂停执行、调度微任务,不会新建上下文,也不会重绑定 this。
非严格模式下 this 的兜底逻辑
非严格模式中,当函数未被明确绑定(如未作为对象方法调用、未用 call/apply/bind)、也未处于箭头函数作用域时,this 会默认指向全局对象(浏览器中是 window,Node.js 中是 globalThis)。
例如:
async function foo() {
console.log(this); // 非严格模式 → window(浏览器)
await Promise.resolve();
console.log(this); // 仍是 window,await 不影响 this
}
foo(); // 直接调用
注意:await 暂停后恢复执行,仍在同一个函数调用上下文中,this 值保持不变。
触发兜底的典型场景
以下情况会导致 this 落入全局对象兜底:
-
直接调用:
foo()→this是全局对象 -
赋值后调用:
const f = obj.foo; f()→this不再是obj,而是全局对象 -
回调中调用:
setTimeout(obj.foo, 100)→this是全局对象(非箭头、非绑定)
这些都不是 await 引起的,而是 JavaScript 原有 this 绑定规则的结果。
与严格模式的关键区别
严格模式下,上述直接调用或丢失绑定的场景中,this 为 undefined;而非严格模式下,它“兜底”到全局对象。这个差异与 async 或 await 无关,只取决于是否启用严格模式(如 'use strict' 或模块默认严格)。
如何避免意外兜底
- 显式绑定:
foo.bind(obj)()或obj.foo.call(obj) - 使用箭头函数包裹(但注意:箭头函数不能直接声明为
async,可写成const fn = async () => { ... },此时this继承外层) - 在类方法中使用
class字段语法 + 箭头函数(如handler = async () => { ... }),自动绑定this
await 本身从不参与 this 绑定过程,它只是“等待器”,不是“绑定器”。











