【题目】介绍一下 JavaScript 中的事件循环(Event Loop)以及宏任务(macrotask)与微任务(microtask)的执行顺序。
答案
JavaScript 中的事件循环是用于处理异步操作的机制。事件循环分为两个阶段:宏任务执行阶段和微任务执行阶段。在每一轮事件循环中,都会执行一个宏任务,然后执行所有的微任务。
- 宏任务(macrotask): 包括整体代码、setTimeout、setInterval、I/O 操作等。宏任务会进入到执行队列,等待下一轮事件循环执行。
- 微任务(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');
输出顺序是:
Script StartScript EndPromise 1Promise 2setTimeout
这是因为微任务优先级高于宏任务,在同一轮事件循环中,微任务会在宏任务之前执行。