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

时间:2014-07-24 18:25:08

标签: javascript web browser

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

这是否需要浏览器跟踪特定标签的所有计时器?

如果是这样,并且在较高的层面上,这是如何实现的?

或者,也许,浏览器能够在不考虑任何个人计时器的情况下限制整个标签的活动?

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

1 个答案:

答案 0 :(得分:1)

当网页移至背景标签页时,浏览器会对定时器进行节流。

浏览器没有特别在后台限制定时器。每个浏览器都有一个事件循环来处理'队列中的工作。当一个事件完成时,它会从队列中提取下一个项目并处理'它(这在浏览器中有所不同)。当浏览器进入后台或选项卡未激活时,事件循环会受到限制。每个浏览器都会以不同的方式实现这一点,并且会以不同方式限制/消除限制。

对于javascript计时器,它们也在事件循环中处理,结果是回调。这实际上意味着javascript中的计时器永远不会100%准确。如果你设置5000毫秒的超时,很可能在事件循环到处理超时/间隔的时候会有几毫秒的延迟,同样当回调函数排队时,延迟将加起来但是,事件循环需要很长时间才能处理它。您的5000毫秒更有可能实时添加几毫秒。

这是否需要浏览器跟踪特定标签的所有计时器?

是的,但是执行的速度与事件循环允许处理作业的速度一样快。

或者,或许是,浏览器能够在不考虑任何个人计时器的情况下限制整个标签的活动?

不,定时器与任何其他代码一样受事件循环的影响。

总结......

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

由于各种原因,开发人员通常会跟踪计时器ID。在某些情况下,这不是多余的吗?假设,开发人员无法调用告诉浏览器的功能,当你在事件循环中到达计时器时,做一些特别的事情"

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

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