事件循环和任务队列
- Window 事件循环驱动所有同源的窗口,这里的同源指由同一个窗口打开的多个子窗口或同一个窗口中的多个 iframe。
- js 引擎线程负责执行 js 代码,当任务队列中存在任务时,会依次执行任务队列中的任务,最先添加到任务队列中的任务会先执行。事件循环会一直运行,执行进入队列中的任务。
- 事件触发线程管理的任务队列,有两种各自独立的任务队列:宏任务队列和微任务队列。
- 事件触发线程会在鼠标、键盘等事件触发时,将事件的处理函数添加到任务队列中。定时器触发线程会在定时器计时结束后,将定时器的处理函数添加到任务队列中。异步 http 请求线程会在请求完成时,将请求的回调函数添加到任务队列中。
- 当前执行栈为空时,会立即执行微任务队列的任务,直至队列中的微任务都执行完,接着进行页面必要的渲染,此时完成一次事件循环。再次执行宏任务中的任务进入下一次事件循环。
- 执行时添加到宏任务队列中的任务不会在本次事件循环中执行。微任务执行期间当有新的微任务添加到队列中,新加的微任务会在本次事件循环中执行。
宏任务包括:
- 一段新程序或子程序被直接执行时(比如控制台、script 标签)
- 事件触发
- setTimeout,setInterval
微任务包括:
- promise
- queueMicrotask
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。