我对这个问题的答案中的一些术语有些困惑:JavaScript 中的事件优先级是什么?
事件循环和任务队列之间有区别吗?这些队列有多大?
因为当我设置一个间隔setInterval()
并用一个中断它时,alert()
间隔会在警报出现的时间被丢弃。
我对这个问题的答案中的一些术语有些困惑:JavaScript 中的事件优先级是什么?
事件循环和任务队列之间有区别吗?这些队列有多大?
因为当我设置一个间隔setInterval()
并用一个中断它时,alert()
间隔会在警报出现的时间被丢弃。
堆:存储所有变量、对象、函数和分配给所有这些内存
事件队列:他是包含列表函数的人,TOBE EXCECUTED By Stack。
Stack : 他是Event queue持有的EXECUTES FUNCTIONS的主要负责人
事件循环:
他是与Event Queue And Stack联系的人(经理) 。
他所做的是。Ifff堆栈为空且事件队列包含要执行的函数。然后将第一个函数从事件队列推送到堆栈
视觉示例 1:latentflip
这是一个实现细节——规范说一个事件循环可以使用多个任务队列来存储事件。大概对队列的大小没有实际限制。
例如,鼠标/键盘事件可以进入一个特殊的 INPUT 任务队列,该队列具有比其他任务更高的优先级,可能是为了使 UI 更具响应性。
alert
会中断事件的处理,因为它是同步操作。在此期间,大概任何适用的事件都会排队。
我认为您只是在setInterval()
. 如果setInterval()
无法跟上所需的间隔率,那么它将跳过间隔,因为如果没有,那么额外的间隔可能会永远建立起来,这不好,因为它会使某个地方的队列饱和。
从我在排队行为中看到的一切来看,间隔和事件都在同一个队列中,并按照它们应该发生的顺序进行处理。不同之处在于,如果setInterval()
队列中已经有一个尚未处理的回调,它不会将另一个回调放入队列(从而跳过它)。
Mousemove 事件也经过特殊处理,因此您也不能用它们填满队列。
您发布的问题确实是一个受欢迎的问题,但是您无法清楚地说明它。
首先,js本质上是同步的。浏览器有助于使其成为异步的。
js 的调用栈是同步工作的,但是每当遇到异步代码(setTimeout(),HTTP 请求)时,它就会被发送到浏览器的 web api。
处理它的地方,例如等待请求的响应或等待超时完成。(这段异步代码暂时从调用栈中移除,调用栈移到下一个任务上)
在 web api 收到响应或超时 fn 结束后,它将被发送到任务队列,该队列将所有异步代码排队
这是事件循环真正发挥作用的地方。它首先检查调用堆栈是否为空,如果是,则将任务队列的第一个元素压入堆栈。
因此,在您发出警报的情况下,它阻塞了调用堆栈,因此无法将 setInterval 推入调用堆栈