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

为何我的JavaScript异步代码输出顺序为we are here、1、3?

代码执行顺序解析

要理解这个输出顺序,核心是搞懂JavaScript的事件循环机制:同步任务优先执行,所有同步任务完成后,才会依次处理微任务队列里的任务。下面一步步拆解代码执行流程:

1. 同步代码阶段

  • 首先声明inc、increment、sub三个异步函数,这只是声明操作,不执行具体逻辑。
  • 调用inc(1):进入函数后执行x = x + await 1,await 1会把1包装成一个已resolve的Promise,此时inc函数暂停执行,将后续计算x = 1 + 1及返回结果的逻辑,放到微任务队列末尾等待执行。
  • 调用sub(3):这是无await的异步函数,会直接返回一个已resolve的Promise(值为3-2=1),它的.then回调被加入微任务队列,排在inc暂停后的逻辑之前。
  • 执行同步代码console.log("we are here\n"),这是第一个输出:we are here。

2. 微任务队列处理阶段

同步任务全部执行完后,开始按顺序处理微任务队列:

  • 第一个待处理的微任务是sub(3)的.then回调,执行console.log(value),输出1,这是第二个输出。
  • 接下来处理inc暂停后的逻辑:计算x=1+1=2,inc函数返回已resolve的Promise(值为2),此时inc(1)的.then回调被加入微任务队列。
  • 处理新增的inc(1)的.then回调:调用increment(2),这是无await的异步函数,直接返回已resolve的Promise(值为2+1=3),它的.then回调被加入微任务队列。
  • 最后处理这个.then回调,执行console.log(x),输出3,这是第三个输出。

这样就形成了we are here → 1 → 3的输出顺序。

内容的提问来源于stack exchange,提问作者user19731938

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:05:25