事件循环

是什么

js 为什么是单线程

同步任务和异步任务

宏任务和微任务

事件循环流程

while (true) {
  queue = getNextQueue(); // 如果是多队列情况则取一个队列
  task = queue.pop(); // 取第一个任务
  execute(task); // 执行任务

  // 如果有微任务那么执行所有的微任务
  while (microTasks.hasTasks()) {
    doMicroTask();
  }

  // 浏览器渲染阶段
  if (isRepaintTime()) {
    // 动画队列有任务 那么执行所有动画 task(requestAnimationFrame)
    animationTasks = animationQueue.copyTasks();
    for (task in animationTasks) {
      doAnimationTask(task);
    }
    // 绘制
    repaint();
  }
}

单次循环迭代中,最多处理一个宏任务(其余的在队列中等待),而队列中的所有微任务都会被处理

为什么微任务执行更早

页面渲染

执行 setTimeout/setInterval 时发生了什么

执行 XHR/fetch 时发生了什么

参考