async函数的this绑定取决于调用方式而非await:直接调用时非严格模式下指向全局对象(如window),方法调用时指向调用对象,await不改变已确定的this值。

在非严格模式下,async 函数内部 await 执行时,全局 this 的兜底行为其实和普通函数完全一致,并不因 await 而改变。关键点在于:await 本身不创建新执行上下文,也不修改 this 绑定;它只是暂停函数体中后续语句的执行,而 this 值早在函数被调用时就已确定。
async 函数的 this 绑定发生在调用时刻
async 函数仍是普通函数,其 this 值取决于调用方式,而非内部是否有 await:
- 直接调用 foo() → 非严格模式下 this 指向全局对象(浏览器中是
window,Node.js 中是globalThis) - 作为方法调用 obj.foo() → this 指向
obj - 用 call/apply/bind 显式绑定 → this 就是传入的对象
await 不会重置或覆盖 this
await 表达式只是让出控制权,等待 Promise 完成后恢复执行,期间函数的词法环境与 this 值保持不变:
- await 前后代码共享同一个执行上下文,this 值不会“丢失”或“重置”
- 即使 await 等待的是一个异步操作(如 fetch、setTimeout 包装的 Promise),也不会触发 this 的重新推导
- 下面例子中,
this始终是全局对象(非严格模式):async function test() { console.log(this === window); await Promise.resolve(); console.log(this === window); }
两次输出都是true
边界情况:箭头函数与嵌套 async 函数
需注意 this 的来源是否被箭头函数捕获,或是否被外层函数影响:
- async 箭头函数没有自己的 this,它继承外层作用域的 this(与普通箭头函数规则一致)
- async 方法定义在对象中,若通过解构赋值提取(
const { fn } = obj),再调用fn(),则 this 会丢失为全局对象(非严格模式)——这不是 await 导致的,而是函数调用方式导致的 - await 后续代码若在 setTimeout 回调中执行(非 await 本身),那回调里的 this 才可能变化,但这已脱离 await 机制范畴
为什么不存在“await 特有的 this 边界内核”?
因为 await 不是作用域关键字,也不是执行上下文切换指令。它底层依赖微任务队列和 Promise 状态机,恢复执行时复用原 async 函数的原有上下文帧。ECMAScript 规范中,AsyncFunctionBody 的执行模型明确要求保留调用时建立的 thisBinding,不受 await 暂停影响。

















