js 中 同步异步 微任务和宏任务 的关系

39 阅读2分钟

在 JavaScript 中,同步和异步编程是为了处理长时间运行的操作或者需要等待的操作。而微任务和宏任务则是异步编程的一个重要概念,用于控制 JavaScript 事件循环。

首先,同步操作是按照代码的先后顺序执行的,每一行代码执行完之后才会执行下一行。这意味着在同步操作执行期间,JavaScript 线程会一直被占用,其他的代码无法执行。

为了解决长时间运行的操作或者需要等待的操作导致的卡顿问题,JavaScript 引入了异步编程。异步操作不会立即执行,而是在将来的某个时间执行。在等待异步操作完成的过程中,JavaScript 引擎可以继续执行其他的代码,这样可以提高代码的效率和响应速度。

微任务和宏任务被用于管理异步操作。微任务和宏任务实际上是 JavaScript 事件循环中的两个不同的阶段。

当执行一个异步操作时,它会被放入队列中,这个队列被称为宏任务队列。当所有同步操作执行完毕,JavaScript 引擎会检查宏任务队列,并选择队列中的下一个任务执行。执行完一个宏任务后,JavaScript 引擎会检查是否存在在宏任务执行期间产生的微任务队列。

微任务队列是用来处理宏任务执行期间产生的异步任务(微任务)的。例如 Promise 的回调函数、MutationObserver 和 process.nextTick() 等都可以被视为微任务。当执行一个宏任务后,JavaScript 引擎会检查是否存在微任务队列,如果存在微任务,则按照先进先出的顺序依次执行微任务。当微任务队列执行完毕后,JavaScript 引擎会再次检查宏任务队列,并选择下一个宏任务执行。

简单来说,宏任务是单个异步任务的执行单位,它包括了整个回调函数的执行过程。而微任务则是宏任务内部的一个步骤,用来执行宏任务产生的异步任务。通过使用微任务和宏任务,可以合理地管理 JavaScript 的异步操作,保证代码的执行顺序和性能。