首页/文章/ JavaScript /JavaScript 事件循环/

JavaScript 事件循环

发布于 12-13 16:36

JavaScript 是单线程的,所有的代码都是在主线程的执行栈中运行。在执行代码过程中,如果遇到一些异步代码,这些代码将会放到幕后线程中去等待,不会阻塞主线程的执行,主线程继续执行栈中剩余的代码。当幕后线程里的代码准备好了,它的回调函数会被放到任务队列中去。在主线程执行完栈中的所有代码后,就会检查任务队列是否有任务,如果有,该任务会被放到执行栈中去执行。如里当前任务队列为空,主线程会一直循环等待任务到来。这就叫做事件循环。


任务队列分为 Macrotask Queue 和 Microtask Queue 两种。

常见的 Macrotask Queue 有:setTimeout、setInterval、用户交互操作、UI 渲染、IO操作、ajax请求等。

常见的 Microtask Queue 有:promise、process.nextTick 。


事件循环的步骤:

  1. 检查 Macrotask Queue 是有任务,如果有进行下一步,否则等待新任务加入后进行下一步。
  2. 从 Macrotask Queue 中取出队首的一个任务放到执行栈去执行,执行完后进行下一步。
  3. 检查 Microtask Queue 是有任务,如果有进行下一步,否则就跳到第1步(一个事件循环周期完成)。
  4. 从 Microtask Queue 中取出队首的一个任务放到执行栈去执行,执行完后跳到第3步。