返回课程

这段代码的输出是什么?

重要性:5
console.log(1);

setTimeout(() => console.log(2));

Promise.resolve().then(() => console.log(3));

Promise.resolve().then(() => setTimeout(() => console.log(4)));

Promise.resolve().then(() => console.log(5));

setTimeout(() => console.log(6));

console.log(7);

控制台输出为:1 7 3 5 2 6 4。

这个任务很简单,我们只需要了解microtask 和 macrotask 队列的工作原理。

让我们一步一步地看看发生了什么。

console.log(1);
// The first line executes immediately, it outputs `1`.
// Macrotask and microtask queues are empty, as of now.

setTimeout(() => console.log(2));
// `setTimeout` appends the callback to the macrotask queue.
// - macrotask queue content:
//   `console.log(2)`

Promise.resolve().then(() => console.log(3));
// The callback is appended to the microtask queue.
// - microtask queue content:
//   `console.log(3)`

Promise.resolve().then(() => setTimeout(() => console.log(4)));
// The callback with `setTimeout(...4)` is appended to microtasks
// - microtask queue content:
//   `console.log(3); setTimeout(...4)`

Promise.resolve().then(() => console.log(5));
// The callback is appended to the microtask queue
// - microtask queue content:
//   `console.log(3); setTimeout(...4); console.log(5)`

setTimeout(() => console.log(6));
// `setTimeout` appends the callback to macrotasks
// - macrotask queue content:
//   `console.log(2); console.log(6)`

console.log(7);
// Outputs 7 immediately.

总结一下,

  1. 数字 17 立即显示出来,因为简单的 console.log 调用不使用任何队列。
  2. 然后,在主代码流完成后,microtask 队列运行。
    • 它包含以下命令:console.log(3); setTimeout(...4); console.log(5)
    • 数字 35 出现,而 setTimeout(() => console.log(4))console.log(4) 调用添加到宏任务队列的末尾。
    • 宏任务队列现在是:console.log(2); console.log(6); console.log(4)
  3. 微任务队列变空后,宏任务队列开始执行。它输出 264

最后,我们得到输出:1 7 3 5 2 6 4