能说说你对宏任务 和 微任务 的理解吗?
宏任务(Macro Task)和微任务(Micro Task)是与JavaScript异步执行机制相关的两个概念。
宏任务(Macro Task):
- 定义: 宏任务代表一个独立的、顺序执行的任务单元,它在执行时会从头到尾一直执行完毕,中途不会被其他任务中断。宏任务包括整体的script代码、setTimeout、setInterval等。
- 执行时机: 当执行栈中的任务执行完毕时,事件队列中的宏任务会被推到执行栈中执行。
微任务(Micro Task):
- 定义: 微任务是一个相对较小的任务单元,它在执行时不会被其他任务中断。微任务包括Promise、process.nextTick、MutationObserver等。
- 执行时机: 在每个宏任务执行完毕后,会检查微任务队列,将微任务队列中的所有任务按顺序执行,直到微任务队列为空。
执行顺序:
- 执行宏任务(执行栈): 从全局任务开始,执行到当前任务队列中的任务(一个宏任务),执行完毕后清空该任务队列。
- 执行微任务(微任务队列): 从微任务队列中依次取出任务执行,直到微任务队列为空。
- 更新渲染(重绘和重排): 浏览器会执行渲染工作,更新页面的显示。
- 重复以上步骤: 重复执行上述步骤,构成一个事件循环。
举例:
console.log('Start'); // 宏任务1
setTimeout(function() {
console.log('Timeout'); // 宏任务2
}, 0);
Promise.resolve().then(function() {
console.log('Promise'); // 微任务
});
console.log('End'); // 宏任务3
输出顺序:
Start
End
Promise
Timeout
解释:
- 执行宏任务1(整体script代码)。
- 执行宏任务2(setTimeout回调)。
- 执行微任务(Promise回调)。
- 执行宏任务3(console.log('End'))。
原文链接:codingdict.net