1. JS 引擎执行当前调用栈的代码(同步任务)。
  2. 遇到异步任务,调用定时器/HTTP/事件线程进行处理。
  3. 异步操作完成,事件触发线程将回调函数推入任务队列
  4. JS 引擎空闲后,检查微任务队列,全部执行完毕。
  5. 事件循环询问 GUI 渲染线程:是否需要重绘(Repaint)
  6. GUI 线程接管控制权,进行 Layout 和 Paint。
  7. GUI 线程挂起,事件循环任务队列中取出一个新的宏任务,交给 JS 引擎,开启下一轮。