首页 > 试题广场 >

控制台输出顺序正确的是()setTimeout(functi

[单选题]
控制台输出顺序正确的是()
setTimeout(function () {
    console.log(1) 、
}, 0);
new Promise(function executor(resolve) {
    console.log(2);
    for (var i = 0; i < 10000; i++) {
        i == 9999 && resolve();
     }
    console.log(3); 
}).then(function () {
    console.log(4); 
});
console.log(5);

  • 25341
  • 23541
  • 52341
  • 51234
**代码回顾** ```js setTimeout(function () { console.log(1); }, 0); new Promise(function executor (resolve) { console.log(2); // 同步① for (var i = 0; i < 10000; i++) { i === 9999 && resolve(); // 调用 resolve → 安排微任务 } console.log(3); // 同步② }).then(function () { console.log(4); // 微任务 }); console.log(5); // 同步③ ``` --- ### 执行顺序拆解 | 阶段 | 发生的事 | 输出 | 说明 | |------|-----------|------|------| | ① 主线程同步 | 运行 `setTimeout`,向 **宏任务队列**插入计时器回调 | — | 只是排队,不会立即执行 | | ② 主线程同步 | 创建 `Promise`,立即执行 **executor** | `2` | `executor` 本身是同步函数 | | | `for` 循环里 `resolve()` 被调用 | — | `resolve` 把 `.then` 回调放入 **微任务队列** | | | 循环结束后同步打印 | `3` | 依旧在同步阶段 | | ③ 主线程同步 | 执行 `console.log(5)` | `5` | 至此,主栈上的同步代码全部执行完毕 | | ④ 清空微任务 | 执行 Promise 的 `.then` 回调 | `4` | 微任务总是在 **本轮宏任务** 结束、渲染之前统一执行 | | ⑤ 取出下一个宏任务 | 0 ms 的 `setTimeout` 回调 | `1` | 计时器属于宏任务,等到 **下一轮事件循环** | 因此最终控制台顺序为 **2 → 3 → 5 → 4 → 1**,对应选项 **B:23541**。 --- ### 关键点回顾 1. **`setTimeout(fn, 0)`** → 宏任务,必定排到下一轮事件循环。 2. **`Promise` executor** 是同步代码;`resolve()` 仅把 `.then` 回调加入 **微任务队列**,不会立刻执行。 3. 事件循环在 **当前宏任务执行完毕** 后,先清空所有微任务,再开始下一轮宏任务(这里就是计时器)。 掌握这三条规则,就能快速判断大多数「同步 / 微任务 / 宏任务」题目的输出顺序。
发表于 2025-04-27 12:01:23 回复(0)