浏览器中的事件循环和任务队列之间有区别吗

Is there a difference between event loop and task queue in browsers?

本文关键字:任务队列 之间 有区别 循环 事件 浏览器      更新时间:2023-09-26

我对这个问题的答案中的一些术语有点困惑:JavaScript中的事件优先级是什么?

事件循环和任务队列之间有区别吗?这些队列有多大?

因为当我用setInterval()设置了一个间隔并用alert()中断时,间隔会在警报显示的时间内被丢弃。

:存储所有变量、对象、函数和To所有这些内存都被分配

事件队列:他是包含列表函数的人堆栈超过

堆栈:他是事件队列持有的执行功能的主要人员

事件循环

  1. 他是与事件队列堆栈联系的人员(经理(。

  2. 他做的是Ifff堆栈事件队列包含要执行的函数然后将事件队列中的第一个函数推送到堆栈

可视化示例1:latentflip

这是一个实现细节-规范说一个事件循环可以使用多个任务队列来存储事件。据推测,队列的大小没有实际限制。

例如,鼠标/键盘事件可以进入一个特殊的INPUT任务队列,该队列的优先级高于其他任务,这可能是为了使UI更具响应性。

alert将中断事件的处理,因为它是一个同步操作。据推测,在此期间,任何适用的事件都将排队。

我认为您只是在setInterval()中看到了一种保护机制。如果setInterval()无法跟上所需的间隔速率,那么它将跳过间隔,因为如果没有,那么额外的间隔可能会永远累积起来,这是不好的,因为它会使某个地方的队列饱和。

从我在排队行为中看到的一切来看,间隔和事件都在同一个队列中,并按照它们应该发生的顺序进行处理。不同的是,如果队列中已经有一个尚未处理的setInterval()回调,它不会在队列中放入另一个回调(从而跳过它(。

Mousemove事件也是经过特殊处理的,所以你也不能用它们来填满队列。

您发布的问题确实很受欢迎,但您无法清晰地回答。

首先,js本质上是同步的。浏览器有助于使它有点异步。

js的调用堆栈是同步工作的,但每当遇到异步代码(setTimeout((,HTTP请求(时,它都会被发送到浏览器的web api。

在哪里处理它,比如等待请求的响应或等待超时完成。(异步代码暂时从调用堆栈中删除,调用堆栈转移到下一个任务(

在web api接收到响应或超时fn结束后,它被发送到任务队列,该队列将所有异步代码排队

这是事件循环真正发挥作用的地方。它首先检查调用堆栈是否为空,如果为空,则将任务队列的第一个元素推送到堆栈上。

因此,在您发出警报的情况下,它阻止了调用堆栈,因此setInterval无法推送到调用堆栈