返回

浅析JS篇:宏任务和微任务,探索浏览器单线程运行机制

前端

JS篇:宏任务和微任务

在JavaScript的世界里,宏任务和微任务是两个关键的概念,理解它们的运行机制对我们深入理解JavaScript的执行流程和任务调度机制至关重要。

JavaScript的单线程特性

JavaScript是单线程的,这意味着它一次只能执行一个任务。当一个任务正在执行时,其他任务必须等待。这种特性决定了JavaScript的任务执行顺序,也影响了宏任务和微任务的调度和执行。

宏任务和微任务的定义

  • 宏任务 :宏任务是JavaScript中常见的任务,包括:

    • setTimeout和setInterval:使用这两个函数创建的计时器任务都是宏任务。
    • UI渲染:当浏览器需要更新UI界面时,会创建一个宏任务来执行渲染操作。
    • I/O操作:例如,使用XMLHttpRequest进行网络请求时,就会创建一个宏任务来处理请求和响应。
    • 脚本执行:除了计时器、UI渲染和I/O操作之外,JavaScript脚本的执行也是宏任务。
  • 微任务 :微任务是JavaScript中的一种特殊任务,通常由浏览器或JavaScript引擎创建和执行。微任务包括:

    • Promise:Promise是一个表示异步操作最终完成或失败的JavaScript对象,当一个Promise被resolved或rejected时,就会创建一个微任务来处理它的结果。
    • MutationObserver:MutationObserver用于监听DOM的变化,当DOM发生变化时,就会创建一个微任务来处理这些变化。
    • requestAnimationFrame:requestAnimationFrame是一个用于在浏览器重绘前执行回调函数的函数,当浏览器准备重绘时,就会创建一个微任务来执行回调函数。

宏任务和微任务的调度和执行

宏任务和微任务的调度和执行顺序遵循以下规则:

  • 在一个事件循环中,宏任务和微任务交替执行。
  • 当一个宏任务正在执行时,其他宏任务必须等待,而微任务可以随时执行。
  • 当一个宏任务执行完成后,所有挂起的微任务都会被执行。
  • 当所有宏任务和微任务都执行完成后,事件循环就会结束。

宏任务和微任务的示例

以下是一个示例,演示宏任务和微任务的不同之处:

console.log('宏任务1');
setTimeout(() => {
  console.log('宏任务2');
}, 0);
Promise.resolve().then(() => {
  console.log('微任务1');
});
console.log('宏任务3');

在这个示例中,宏任务1、宏任务3和宏任务2是按照顺序执行的,而微任务1是在宏任务3执行之前执行的。这是因为微任务会在每个宏任务执行完成后立即执行。

小结

宏任务和微任务是JavaScript中的两个关键概念,理解它们的运行机制对我们深入理解JavaScript的执行流程和任务调度机制至关重要。宏任务和微任务的调度和执行顺序遵循一定的规则,这使得我们能够更好地控制JavaScript的异步操作。