You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:19:53