返回

基于思路差异解读 JavaScript 同步异步、宏任务和微任务

见解分享

同步与异步

在 JavaScript 中,任务的执行方式主要分为同步和异步两种。

  • 同步任务: 同步任务会在当前调用栈中执行,也就是说,它会阻塞后面的任务,直到它执行完毕。例如,变量声明、函数调用等都是同步任务。

  • 异步任务: 异步任务不会阻塞后面的任务,它会在当前调用栈执行完毕后执行。例如,setTimeout()XMLHttpRequest 等都是异步任务。

宏任务与微任务

宏任务和微任务是 JavaScript 中任务的另一种分类。

  • 宏任务: 宏任务是 JavaScript 中的基本任务单位,它包括 setTimeout()setInterval()I/O 操作等。宏任务是在事件循环的主线程中执行的,它的执行顺序遵循先进先出的原则。

  • 微任务: 微任务也是 JavaScript 中的基本任务单位,它包括 Promise.then()MutationObserverprocess.nextTick 等。微任务是在事件循环的主线程中执行的,但是它的执行顺序与宏任务不同,它遵循先入先出的原则。

任务执行顺序

JavaScript 的任务执行顺序遵循以下规则:

  1. 同步任务会在当前调用栈中执行,它会阻塞后面的任务,直到它执行完毕。

  2. 异步任务会在当前调用栈执行完毕后执行,它不会阻塞后面的任务。

  3. 宏任务和微任务都是在事件循环的主线程中执行的,但宏任务遵循先进先出的原则,而微任务遵循先入先出的原则。

  4. 当主线程空闲时,它会依次执行宏任务队列和微任务队列中的任务。

理解事件循环模型

JavaScript 的事件循环模型是一个循环的过程,它不断地从任务队列中获取任务并执行它们。事件循环模型由以下几个部分组成:

  • 调用栈: 调用栈是一个后进先出的栈,它存储着当前正在执行的函数。

  • 任务队列: 任务队列是一个先进先出的队列,它存储着等待执行的宏任务和微任务。

  • 事件循环: 事件循环不断地从任务队列中获取任务并执行它们。当主线程空闲时,它会依次执行宏任务队列和微任务队列中的任务。

应用场景

同步任务和异步任务、宏任务和微任务在 JavaScript 中都有着广泛的应用。

  • 同步任务: 同步任务通常用于执行一些简单的操作,例如变量声明、函数调用等。

  • 异步任务: 异步任务通常用于执行一些耗时的操作,例如 setTimeout()XMLHttpRequest 等。

  • 宏任务: 宏任务通常用于执行一些需要等待的操作,例如 setTimeout()setInterval()I/O 操作等。

  • 微任务: 微任务通常用于执行一些需要立即执行的操作,例如 Promise.then()MutationObserverprocess.nextTick 等。

总结

JavaScript 中的同步异步、宏任务和微任务是两个不同的任务分类维度。同步异步了任务的执行方式,宏任务和微任务了任务的执行顺序。理解 JavaScript 中的任务执行机制对于编写出高性能、可维护的代码非常重要。