Skip to content

事件循环

消息队列

消息队列是一个待处理消息的消息队列,存放着宏任务

宏任务

宏任务是较大粒度的任务单元,通常是由浏览器或 JavaScript 引擎提供的异步操作

  • script
  • setTimeout
  • setInterval
  • window.setImmediate
  • requestAnimationFrame
  • I/O
  • UI render

微任务

微任务是较小粒度的任务单元,执行时机在宏任务之后、渲染之前,确保了微任务之间的应用程序环境基本相同(没有鼠标坐标更改,没有新的网络数据等)

  • promise
  • process.nextTick (node.js)
  • queueMicrotask
  • MutationObserver

TIP

  • 每个宏任务之后,引擎会立即执行微任务队列中的所有任务,然后再执行其他的宏任务,或渲染,或进行其他任何操作
  • 在微任务之间没有 UI 或网络事件的处理:它们一个立即接一个地执行

事件循环

  1. 当前执行栈为空时,事件循环从消息队列中取出一个宏任务执行
  2. 执行宏任务的过程中,如果遇到微任务,则将微任务放入微任务队列中
  3. 当宏任务执行完毕后,事件循环会检查微任务队列,依次执行所有的微任务,直到微任务队列为空
  4. 如果微任务执行过程中又产生了新的微任务,则继续将其放入微任务队列中,并执行
  5. 重复上述步骤,从消息队列中取出下一个宏任务,继续循环