事件循环有哪些 哪些是宏任务哪些是微任务

47 阅读2分钟

JavaScript 的事件循环(Event Loop)是其执行异步操作的核心机制。事件循环主要包括以下几个部分:

  1. 调用栈(Call Stack) :JavaScript 是单线程的,它只有一个调用栈,用于存储执行上下文。当函数被调用时,会创建一个执行上下文并压入调用栈,当函数执行完毕后,会从调用栈中弹出。
  2. 任务队列(Task Queue) :当异步操作(如 setTimeout、Promise 等)完成时,会将对应的回调函数放入任务队列中等待执行。
  3. 微任务队列(Microtask Queue) :当 Promise 等微任务完成时,会将对应的回调函数放入微任务队列中等待执行。微任务队列的优先级高于任务队列,当调用栈为空时,会先执行微任务队列中的所有任务,然后再执行任务队列中的任务。
  4. 事件循环:事件循环的工作就是不断地检查调用栈是否为空,如果为空,就从任务队列中取出一个任务执行。在每个任务执行之间,会先执行微任务队列中的所有任务。

这就是 JavaScript 的事件循环的基本结构。通过这种机制,JavaScript 可以在单线程中实现非阻塞的异步操作。

在 JavaScript 的事件循环中,任务可以分为宏任务(MacroTask)和微任务(MicroTask)。

宏任务 包括:

  • setTimeout
  • setInterval
  • setImmediate(Node.js 环境)
  • requestAnimationFrame
  • I/O 操作(Node.js 环境)
  • UI 渲染(浏览器环境)

微任务 包括:

  • Promise.then 或 Promise.catch
  • process.nextTick(Node.js 环境)
  • MutationObserver(浏览器环境)

事件循环的执行顺序是:每次执行完一个宏任务后,会检查微任务队列,如果有微任务,就执行所有的微任务,然后再执行下一个宏任务。这就是为什么微任务的优先级高于宏任务,因为微任务总是在下一个宏任务开始前执行。