事件循环
消息队列
消息队列是一个待处理消息的消息队列,存放着宏任务
宏任务
宏任务是较大粒度的任务单元,通常是由浏览器或 JavaScript 引擎提供的异步操作
- script
- setTimeout
- setInterval
- window.setImmediate
- requestAnimationFrame
- I/O
- UI render
微任务
微任务是较小粒度的任务单元,执行时机在宏任务之后、渲染之前,确保了微任务之间的应用程序环境基本相同(没有鼠标坐标更改,没有新的网络数据等)
- promise
- process.nextTick (node.js)
- queueMicrotask
- MutationObserver
TIP
- 每个宏任务之后,引擎会立即执行微任务队列中的所有任务,然后再执行其他的宏任务,或渲染,或进行其他任何操作
- 在微任务之间没有 UI 或网络事件的处理:它们一个立即接一个地执行
事件循环
- 当前执行栈为空时,事件循环从消息队列中取出一个宏任务执行
- 执行宏任务的过程中,如果遇到微任务,则将微任务放入微任务队列中
- 当宏任务执行完毕后,事件循环会检查微任务队列,依次执行所有的微任务,直到微任务队列为空
- 如果微任务执行过程中又产生了新的微任务,则继续将其放入微任务队列中,并执行
- 重复上述步骤,从消息队列中取出下一个宏任务,继续循环