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

时间:2013-02-26 16:09:02

标签: javascript javascript-events setinterval task-queue event-loop

我对这个问题的答案中的一些术语感到有点困惑:What is the event precedence in JavaScript?

事件循环和任务队列之间是否存在差异?这些队列有多大?

因为当我使用setInterval()设置一个Interval并使用alert()中断它时,会在警报显示的时间内删除间隔。

4 个答案:

答案 0 :(得分:5)

:存储所有变量,对象,函数和所有这些内存已分配

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

筹码:他是事件队列

持有的执行 功能的主要人物

事件循环

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

  2. 他做的是什么。 Ifff 堆栈 事件队列包含功能执行。然后将第一个功能从事件队列推送到堆栈

  3. 视觉示例1 latentflip

答案 1 :(得分:2)

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

例如,鼠标/键盘事件可能会进入一个特殊的INPUT任务队列,该队列的优先级高于其他任务,可能会使UI更具反复性。

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

答案 2 :(得分:1)

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

从我在排队行为中看到的所有内容中,间隔和事件都在同一个队列中,并按照它们要发生的顺序进行处理。不同之处在于,如果队列中已经存在尚未处理的setInterval()回调,则不会将另一个回调放入队列中(从而跳过它)。

Mousemove事件也会被特别处理,因此您无法使用它们填充队列。

答案 3 :(得分:0)

您发布的问题确实很受欢迎,但您无法说清楚。

首先,js 本质上是同步的。浏览器有助于使其具有某种异步性。

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

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

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

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

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