当我有多个标签打开到我的网站时,为什么我的setTimeout会加速?

lam*_*ter 6 javascript timer settimeout setinterval fbjs

我有一个计时器,每秒倒计时.它工作得很好,直到用户打开我站点的3或4个选项卡,此时最新选项卡的计时器变为双倍或三倍速度.我目前只能重现IE8中的错误.我以前使用的是setInterval,也可以重现Firefox中的错误.

我实际上正在使用FBJS(Facebook的Javascript),所以我只会给出一些伪代码.

function countDown() {
  ...
  setTimeout(function() { countDown() }, 1000);    
}

countDown();
Run Code Online (Sandbox Code Playgroud)

但是,我真正想要的是更理论化的.我知道浏览器可以尝试使用setInterval"追赶",但是多个选项卡如何导致setTimeout的这种行为?

cha*_*aos 5

整个情况非常奇怪.唯一可以理解的情况是浏览器试图"平滑"自恢复setTimeouts的时间段,与setInterval相同,并且正在执行的代码实际上将定时器混淆在不同的窗口中其他.

我不知道它是否可行,特别是涉及到Facebook,但一个有趣的测试是为每个实例提供一个countDown函数的随机名称,看看是否有任何区别,如:

<?php $timerTag = rand(1, 1000); ?>
function countDown<?php echo $timerTag ?>() {
  ...
  setTimeout(function() { countDown<? php echo $timerTag ?>() }, 1000);    
}

countDown<?php echo $timerTag ?>();
Run Code Online (Sandbox Code Playgroud)

如果这改变了观察到的行为,那就是我想到的场景.(并且可能提供解决问题的方法.)