await 不会恢复上下文,而是暂停当前 async 函数执行、将后续代码作为微任务注册,待 Promise settle 后在原词法作用域和变量环境中继续执行,保持 this 绑定与闭包有效性。

await 并不会“恢复上下文”,而是让 JavaScript 引擎在异步任务完成后,继续执行当前函数中 await 后面的代码,且保持原有的词法作用域、this 绑定和变量环境。
await 的本质是语法糖,背后依赖 Promise 和微任务调度
当遇到 await promise 时,JavaScript 引擎会:
- 暂停当前 async 函数的执行(不阻塞主线程)
- 将 await 后面的代码包装成一个微任务(microtask),注册到 Promise 的
then队列中 - 函数立即返回一个 pending 状态的 Promise,控制权交还给调用者
- 待 promise settle(fulfilled/rejected)后,引擎在下一个微任务阶段执行后续逻辑
词法作用域和变量环境完全保留
await 不会新建执行上下文,它所在的 async 函数的 LexicalEnvironment 和 VariableEnvironment 在暂停和恢复期间始终存在。例如:
let count = 1;async function demo() {
console.log(count); // 1
await Promise.resolve();
count++;
console.log(count); // 2 —— 同一个 count 变量,未被销毁或重置
}
this 和闭包行为与同步代码一致
async 函数中 this 的绑定发生在调用时,await 不会影响它;闭包捕获的外部变量也持续有效:
立即学习“Java免费学习笔记(深入)”;
- 箭头函数中的 this 仍指向定义时的外层 this
- 普通函数若通过 call/apply 绑定过 this,await 后仍维持该绑定
- 所有闭包引用的自由变量(如父级函数的局部变量)均可正常访问
注意:await 恢复的是“函数内”的执行流,不是整个调用栈
await 只挂起当前 async 函数,其上层同步调用者早已继续执行。例如:
function outer() {console.log('before');
inner(); // 立即返回 Promise,不等待
console.log('after'); // 这行立刻执行
}
async function inner() {
await delay(1000);
console.log('done'); // 1秒后才打印
}
这里没有“上下文恢复”到 outer,outer 的执行根本不等待 inner。


















