async函数的this由调用方式决定,await不影响this绑定;非严格模式下普通调用时this指向全局对象,这是函数默认行为而非await导致。

在非严格模式下,async 函数内部的 await 本身不改变 this 的绑定逻辑——this 的值仍由函数调用方式决定,await 只是暂停执行,不会重置或兜底 this。所谓“全局 this 兜底”,实际指的是:当 async 函数以**普通函数调用方式**(即不通过对象属性、call/apply/bind)执行时,其内部的 this 会默认指向全局对象(浏览器中是 window,Node.js 中是 globalThis),这是非严格模式下普通函数的默认行为,和 await 无关。
async 函数的 this 不由 await 决定
await 是一个操作符,它只负责暂停当前 async 函数的执行,并等待 Promise settle,但不会影响 this 的绑定时机或值。async 函数的 this 在函数被调用那一刻就已确定,后续所有语句(包括 await 后的代码)都沿用该 this。
- 如果 async 函数作为对象方法被调用(
obj.fn()),this指向obj,await前后不变 - 如果 async 函数被直接调用(
fn()),非严格模式下this自动绑定为全局对象 - 箭头函数内部没有自己的
this,它继承外层作用域的this,这点在 async 函数内同样适用
常见误解:await 会让 this “丢失”或“重置”
其实不是 await 导致的,而是异步回调中常见的 this 绑定问题被误归因于 await。例如:
const obj = {
name: 'Alice',
async run() {
// 这里的 this 指向 obj
console.log(this.name); // Alice
await new Promise(resolve => setTimeout(resolve, 100));
// await 后 this 仍是 obj,没变
console.log(this.name); // Alice
}
};
obj.run();
但如果写成:
const obj = {
name: 'Alice',
async run() {
setTimeout(() => {
console.log(this.name); // 非严格模式下 this 是 window,输出 undefined 或全局 name
}, 100);
}
};
这里的问题出在 setTimeout 的回调函数(普通函数)的调用方式,而非 await。async/await 本身不引入新的执行上下文,也不改变调用链。
如何避免 this 意外指向全局
- 始终使用严格模式(
"use strict"),此时普通调用下this为undefined,更容易暴露绑定问题 - 用箭头函数封装需访问
this的回调(它继承外层 async 函数的this) - 显式绑定:
setTimeout(() => { ... }, 100)或setTimeout(fn.bind(this), 100) - 避免裸调用 async 函数;若必须,用
bind或箭头函数包装确保this明确
本质上,async 函数的 this 行为和普通函数完全一致,await 只是语法糖层面的暂停机制,不参与执行上下文的创建或 this 绑定。所谓“兜底”,只是非严格模式下函数调用的默认 fallback,不是 await 的特性。











