4

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

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

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

4

4 回答 4

6

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

事件队列:他是包含列表函数的人,TOBE EXCECUTED By Stack

Stack : 他是Event queue持有的EXECUTES FUNCTIONS的主要负责人

事件循环

  1. 他是与Event Queue And Stack联系的人(经理) 。

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

视觉示例 1latentflip

于 2015-04-16T07:03:34.690 回答
3

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

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

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

于 2013-02-26T16:16:05.600 回答
1

我认为您只是在setInterval(). 如果setInterval()无法跟上所需的间隔率,那么它将跳过间隔,因为如果没有,那么额外的间隔可能会永远建立起来,这不好,因为它会使某个地方的队列饱和。

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

Mousemove 事件也经过特殊处理,因此您也不能用它们填满队列。

于 2013-02-26T16:14:16.937 回答
0

您发布的问题确实是一个受欢迎的问题,但是您无法清楚地说明它。

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

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

处理它的地方,例如等待请求的响应或等待超时完成。(这段异步代码暂时从调用栈中移除,调用栈移到下一个任务上)

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

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

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

于 2020-12-21T05:23:20.383 回答