一个完整的事件循环过程,可以概括为一下阶段:

# 事件循环

由于 js 是单线程的编程语言,同一时间只能做一件事情,所有任务都要排队一件一件完成。

事件循环分为同步任务和异步任务

同步任务就是主线程上排队执行的任务。只有当前任务执行完,才会执行下一个任务。

异步任务不进入主线程,而是进入任务队列的任务,只有任务队列通知主线程某个异步任务可以执行了,才会进入主线程执行这个任务。

任务队列又分为宏任务和微任务:

  • 宏任务:script,setTimeout,setInterval
  • 微任务:promise 的 then,MutationObserver
  1. 主线程执行同步代码
  2. 遇到宏任务添加到宏任务队列
  3. 遇到微任务添加到微任务队列
  4. 同步代码执行完毕,接下来会先清空微任务队列(回到 2、3)直到清空微队列
  5. 然后从宏队列取出一个任务(回到2,3,4)直到宏任务队列清空。

常见的宏任务:

  • setTimeout
  • setInterval
  • setImmediate
  • script 代码块
  • I/O 操作。

常见的微任务:

  • Promise.then()
  • MutationObserver
  • process.nextTick