Javascript 当我的站点打开多个选项卡时,为什么设置超时会加快?

Javascript 当我的站点打开多个选项卡时,为什么设置超时会加快?,javascript,timer,settimeout,fbjs,setinterval,Javascript,Timer,Settimeout,Fbjs,Setinterval,我有一个每秒钟倒计时的计时器。直到用户打开“我的网站”的3到4个标签,最新标签的计时器就会以两倍或三倍的速度运行,它才会工作得很好。我目前只能在IE8中重现这个bug。我以前使用过setInterval,也可以在Firefox中重现这个bug 我实际上使用的是FBJS(Facebook的Javascript),所以我只给出一些伪代码 function countDown() { ... setTimeout(function() { countDown() }, 1000); }

我有一个每秒钟倒计时的计时器。直到用户打开“我的网站”的3到4个标签,最新标签的计时器就会以两倍或三倍的速度运行,它才会工作得很好。我目前只能在IE8中重现这个bug。我以前使用过setInterval,也可以在Firefox中重现这个bug

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

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

countDown();

然而,我真正想要的是更多的理论。我知道浏览器可以尝试使用setInterval来“追赶”,但多个选项卡怎么会导致setTimeout出现这种行为呢?

整个情况非常奇怪。我想到的唯一一个有意义的场景是,浏览器试图“平滑”自恢复设置超时的时间段,与setInterval的情况相同,而正在执行的代码实际上将不同窗口中的计时器相互混淆

我不知道这是否可行,尤其是在涉及Facebook的情况下,但一个有趣的测试是给每个实例一个随机名称,用于
倒计时
函数,看看这是否有任何区别,比如:

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

countDown<?php echo $timerTag ?>();

函数倒计时(){
...
setTimeout(函数(){countDown()},1000);
}
倒计时();

如果这改变了观察到的行为,这就证明了我心目中的情景。(并且可能提供了一种解决问题的方法。)

哇,给函数随机命名就成功了!不同窗口中的javascript怎么可能相互影响?很奇怪,不是吗?我想这一定是像我说的那样,在浏览器的内脏中的某个地方“平滑”代码,只按名称(很可能是按站点+名称)识别函数,而不区分不同的选项卡/窗口。这可能是一个没有PHP的替代解决方案: