浏览器如何存储JavaScript计时器?

浏览器如何存储JavaScript计时器?,javascript,web,browser,Javascript,Web,Browser,当网页移动到“背景”选项卡时,浏览器会限制计时器 这难道不需要浏览器跟踪特定选项卡的所有计时器吗 如果是这样的话,在高层次上,这是如何实现的 或者,浏览器是否能够在不考虑任何单个计时器的情况下限制整个选项卡的活动 特别是:开发人员出于各种原因经常跟踪计时器ID。在某些情况下,这不是多余的吗?假设,开发人员不能调用一个函数,告诉浏览器“当你到达事件循环中的计时器时,做一些特殊的事情”当网页移动到后台选项卡时,浏览器会限制计时器。 浏览器不会专门在后台调节计时器。每个浏览器都有一个事件循环,用于处理

当网页移动到“背景”选项卡时,浏览器会限制计时器

这难道不需要浏览器跟踪特定选项卡的所有计时器吗

如果是这样的话,在高层次上,这是如何实现的

或者,浏览器是否能够在不考虑任何单个计时器的情况下限制整个选项卡的活动


特别是:开发人员出于各种原因经常跟踪计时器ID。在某些情况下,这不是多余的吗?假设,开发人员不能调用一个函数,告诉浏览器“当你到达事件循环中的计时器时,做一些特殊的事情”

当网页移动到后台选项卡时,浏览器会限制计时器。

浏览器不会专门在后台调节计时器。每个浏览器都有一个事件循环,用于处理队列中的作业。当一个事件完成时,它从队列中提取下一个项目并处理它(这在不同浏览器中有所不同)。当浏览器进入后台或选项卡处于非活动状态时,事件循环将被限制。同样,每个浏览器都以不同的方式实现这一点,并将以不同的方式限制/取消限制

至于javascript计时器,它们也在事件循环中处理,结果回调也是如此。这实际上意味着javascript中的计时器永远不会100%准确。如果将超时设置为5000毫秒,则在事件循环开始处理超时/间隔时,很可能已经有几毫秒的延迟,而且当回调函数排队时,延迟加起来将等于事件循环处理它所花费的时间。您的5000ms更有可能实时添加一些ms

这难道不需要浏览器跟踪特定选项卡的所有计时器吗?

是的,它会,但是执行速度只有在事件循环允许处理作业时才能达到

或者,浏览器是否能够在不考虑任何单个计时器的情况下限制整个选项卡的活动?

不,计时器和其他代码一样受事件循环的影响

总之…

如果事件循环被限制,它将无法以最快的速度通过队列,因此循环中的任何内容(包括计时器)的完成速度都将比平时慢


由于各种原因,开发人员经常跟踪计时器ID。在某些情况下,这不是多余的吗?假设,开发人员不能调用一个函数,告诉浏览器“当您到达事件循环中的计时器时,做一些特殊的事情”

是的,在某些情况下它可能是多余的,我经常引用我的超时或从函数返回它们,但从未对引用做过任何事情,至少将来我需要对它做些什么


我不确定我是否100%理解你关于这件事的第二部分。当您到达事件循环中的计时器时,开发人员会做一些特殊的事情,特别是在延迟结束后的某个时间点执行回调。除此之外,除了排队等待代码执行之外,您无法控制循环本身

由于各种原因,开发人员经常跟踪计时器ID。在某些情况下,这不是多余的吗?假设,开发人员不能调用一个函数,告诉浏览器“当你到达事件循环中的计时器时,做一些特殊的事情”。作为开发人员,事件循环对我们是隐藏的,我们不需要靠近它或干扰它。在运行的脚本中跟踪计时器是有益的,特别是如果您使用setTimeout over setInterval来管理需要间隔行为但只需要x次迭代的情况。误解可能是我们对特殊行为的定义。我的意思是特殊的,因为目前还没有完成。举个简单的例子,
turnBrowserBlue()
可以是一个函数,当调用该函数时,该函数会设置一个侦听器,每当在事件循环中除回调外到达计时器时,该侦听器就会将浏览器变为蓝色。哦,我明白了,据我所知,您无法直接访问事件循环中的侦听器以执行特定操作。这在设计上更可能是因为对客户端上的事件循环的干扰可能被视为安全漏洞。