能说说你对宏任务 和 微任务 的理解吗?


宏任务(Macro Task)和微任务(Micro Task)是与JavaScript异步执行机制相关的两个概念。

宏任务(Macro Task):

  • 定义: 宏任务代表一个独立的、顺序执行的任务单元,它在执行时会从头到尾一直执行完毕,中途不会被其他任务中断。宏任务包括整体的script代码、setTimeout、setInterval等。
  • 执行时机: 当执行栈中的任务执行完毕时,事件队列中的宏任务会被推到执行栈中执行。

微任务(Micro Task):

  • 定义: 微任务是一个相对较小的任务单元,它在执行时不会被其他任务中断。微任务包括Promise、process.nextTick、MutationObserver等。
  • 执行时机: 在每个宏任务执行完毕后,会检查微任务队列,将微任务队列中的所有任务按顺序执行,直到微任务队列为空。

执行顺序:

  1. 执行宏任务(执行栈): 从全局任务开始,执行到当前任务队列中的任务(一个宏任务),执行完毕后清空该任务队列。
  2. 执行微任务(微任务队列): 从微任务队列中依次取出任务执行,直到微任务队列为空。
  3. 更新渲染(重绘和重排): 浏览器会执行渲染工作,更新页面的显示。
  4. 重复以上步骤: 重复执行上述步骤,构成一个事件循环。

举例:

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. 执行宏任务1(整体script代码)。
  2. 执行宏任务2(setTimeout回调)。
  3. 执行微任务(Promise回调)。
  4. 执行宏任务3(console.log('End'))。


原文链接:codingdict.net