JavaScript Promise执行顺序疑问:console.log输出的i值是否为20?
结论:
console.log输出的是10,之后i才会变为20 先看这段代码:
function doCall(a){ return new Promise ((f) => { f(a * 2); }); } function test () { let i = 10; doCall(i).then((a) => { i = a; }); console.log(i); }
执行顺序拆解:
- 调用
test后,先执行let i = 10,此时i的值为10。 - 接着调用
doCall(i),Promise的执行器函数是同步执行的,直接调用了resolve函数得到结果20,但.then()里的回调属于微任务,会被放进微任务队列等待,不会立刻执行。 - 随后立刻执行
console.log(i),这时候i还是初始的10,所以控制台会打印10。 - 等当前所有同步代码执行完毕,JS引擎才会处理微任务队列,这时候
.then()里的回调才会执行,把i改成20。
也就是说你认为的i变为20是在console.log执行之后才发生的,控制台输出的依旧是10。
内容的提问来源于stack exchange,提问作者aaa
相关产品推荐
相关产品推荐

