JavaScript:为何无法通过外部变量更新循环变量?
问题分析:为何glb2始终无法更新?
核心原因是JavaScript单线程的事件循环机制导致同步代码阻塞了异步任务的执行,具体拆解如下:
- 调用
f()后,首先执行wait():wait作为async函数,执行到await new Promise(...)时,会把setTimeout的回调加入宏任务队列,随后wait()暂停执行并返回Promise,主线程继续处理f()内的同步代码。 - 接下来初始化
glb2 = "original",随即进入while循环——这是同步阻塞代码,会持续占用主线程,不断重复判断、赋值和打印操作。 - JavaScript的事件循环规则是:必须等当前所有同步任务执行完毕,才会处理宏任务队列里的任务。这个
while循环永远不会终止,主线程被完全占用,setTimeout的回调根本没有执行机会,glb也就永远不会被修改为"updated",glb2自然始终是"original",死循环无法停止。
修复示例(推荐异步等待方式)
let glb = "original"; async function wait() { await new Promise(resolve => setTimeout(resolve, 2000)); glb = "updated"; } async function f() { await wait(); // 等待异步任务完成后再执行后续逻辑 let glb2 = glb; console.log("#### DONE glb:" + glb); } f();
内容的提问来源于stack exchange,提问作者Michael Johns
相关产品推荐
相关产品推荐

