【每日一题】介绍一下 JavaScript 中的事件循环(Event Loop)以及宏任务(macrotask)与微任务(microtask)的执行顺序。

77 阅读1分钟

【题目】介绍一下 JavaScript 中的事件循环(Event Loop)以及宏任务(macrotask)与微任务(microtask)的执行顺序。

99763d97a4874d6494328f2dce568166_2.png

答案

JavaScript 中的事件循环是用于处理异步操作的机制。事件循环分为两个阶段:宏任务执行阶段和微任务执行阶段。在每一轮事件循环中,都会执行一个宏任务,然后执行所有的微任务。

  1. 宏任务(macrotask): 包括整体代码、setTimeout、setInterval、I/O 操作等。宏任务会进入到执行队列,等待下一轮事件循环执行。
  2. 微任务(microtask): 包括Promise、MutationObserver等。微任务会在当前任务执行结束后立即执行,不会等待下一轮事件循环。

执行顺序如下:

  • 一开始,执行整体代码(Script)。
  • 执行一个宏任务,然后执行所有的微任务。
  • 重复上述步骤,直到宏任务队列和微任务队列都为空。

在每一个宏任务中,执行的微任务是有优先级的。微任务队列中的任务会在下一个宏任务之前执行完毕。

例如:

console.log('Script Start');

setTimeout(() => {
  console.log('setTimeout');
}, 0);

Promise.resolve().then(() => {
  console.log('Promise 1');
}).then(() => {
  console.log('Promise 2');
});

console.log('Script End');

输出顺序是:

  1. Script Start
  2. Script End
  3. Promise 1
  4. Promise 2
  5. setTimeout

这是因为微任务优先级高于宏任务,在同一轮事件循环中,微任务会在宏任务之前执行。

扫码_搜索联合传播样式-白色版.png