乐趣区

关于javascript:事件循环和任务队列

事件循环和工作队列


  1. Window 事件循环驱动所有同源的窗口,这里的同源指由同一个窗口关上的多个子窗口或同一个窗口中的多个 iframe。
  2. js 引擎线程负责执行 js 代码,当工作队列中存在工作时,会顺次执行工作队列中的工作,最先增加到工作队列中的工作会先执行。事件循环会始终运行,执行进入队列中的工作。
  3. 事件触发线程治理的工作队列,有两种各自独立的工作队列:宏工作队列和微工作队列。
  4. 事件触发线程会在鼠标、键盘等事件触发时,将事件的处理函数增加到工作队列中。定时器触发线程会在定时器计时完结后,将定时器的处理函数增加到工作队列中。异步 http 申请线程会在申请实现时,将申请的回调函数增加到工作队列中。
  5. 以后执行栈为空时,会立刻执行微工作队列的工作,直至队列中的微工作都执行完,接着进行页面必要的渲染,此时实现一次事件循环。再次执行宏工作中的工作进入下一次事件循环。
  6. 执行时增加到宏工作队列中的工作不会在本次事件循环中执行。微工作执行期间当有新的微工作增加到队列中,新加的微工作会在本次事件循环中执行。
  7. 宏工作包含:

    • 一段新程序或子程序被间接执行时(比方控制台、script 标签)
    • 事件触发
    • setTimeout,setInterval
  8. 微工作包含:

    • promise
    • queueMicrotask

更多:

  • 并发模型和事件循环
  • 深刻:微工作与 Javascript 运行时环境
  • 在 JavaScript 中通过 queueMicrotask() 应用微工作
退出移动版