2011-04-27 66 views
15

有问题。如果我使用的setInterval以这种方式:javascript setInterval

setInterval('doSome();',60000); 

我是安全的doSome()功能是每60秒发送一次,即使我改变浏览器的标签?

+6

你不应该传递一个字符串'setInterval'但功能:'的setInterval(doSome,60000);'或者如果你需要的参数等:'的setInterval(函数(){doSome(12345);}, 60000);' – ThiefMaster 2011-04-27 08:58:06

+0

当然。我建议你把它作为setInterval(doSome,60000)来代替,这样更有效率。 – gpilotino 2011-04-27 08:59:33

+0

传递给'setInterval'的字符串很好。区别在于他们如何评估以及从什么范围进行评估。 – 2011-04-27 09:13:33

回答

1

如果setInterval()函数的选项卡保持打开状态,那么该函数将每60秒执行一次,即使您切换到或打开其他选项卡。

0

是,浏览器的焦点是无关紧要的。

但是,您不应使用setInterval的字符串参数。请使用该功能的参考代替:

setInterval(doSome, 60000); 
+0

传递给'setInterval'的字符串很好。区别在于他们如何评估以及从什么范围进行评估。 – 2011-04-27 09:12:18

+0

@Delan速度和语法突出显示,以及需要执行诸如转义引号之类的蠢事。将字符串传递给'setInterval'并不是错误的*,本身就是没有意义的。 – lonesomeday 2011-04-27 10:30:36

+0

这是真的,我同意你的看法。 – 2011-04-27 10:41:48

0

不,您无法保证确切的时间安全。 JS是基于事件(和单一三合一)的,所以事件不会在恰当的时刻触发,特别是当你的页面上同时运行其他代码时。

事件将在设定的时间值附近触发,但不是精确的毫秒。即使当时没有其他事件正在运行,错误可能是几十毫秒。这可能是一个问题,例如,如果您有一个长时间运行的流程,其中时间安排非常重要。如果你这样做,你需要偶尔同步一个时钟。

0

是的,只要页面处于打开状态,无论切换标签页还是浏览器被最小化,都会被调用。

但是确保你传递给函数不是字符串给setInterval

应该>

setInterval(doSome, 60000)

+0

传递给'setInterval'的字符串很好。区别在于他们如何评估以及从什么范围进行评估。 – 2011-04-27 09:13:09

+0

谢谢,我不知道。 – neebz 2011-04-27 09:24:36

28

将字符串传递到setInterval是好的,而且是两种方式,以一个使用setInterval,另一个是传递一个函数指针。这与其他答案状态没有任何关系,但并不像其他答案那样有效(因为必须重新编写代码),而且您的目的也不是必需的。无论

setInterval('doSome();', 60000); // this runs doSome from the global scope 
           // in the global scope 

setInterval(doSome, 60000);  // this runs doSome from the local scope 
           // in the global scope 

是正确的,但他们有一个含义略有不同。如果doSome对于某个非全局作用域是本地的,则在相同作用域内调用后者将以60000ms间隔运行本地doSome。调用前面的代码将始终在全局范围内查找doSome,并且如果全局范围中没有doSome函数,将会失败。

功能将可靠地被触发,而不考虑标签的焦点,在至少 60000毫秒间隔,但通常稍微由于开销和延迟。

所有浏览器将间隔值限制在至少一定的值以避免间隔过于频繁(我认为这是最小值10ms或4ms,或者我不能完全记住)。请注意,有些浏览器(即将推出的Firefox 5是一款,但也有可能是我不知道的其他浏览器)会进一步将setInterval严重限制为例如1/4。如果选项卡未聚焦,则为1000毫秒。 (Reference

+0

另一个区别 - 在第一个版本中,您可以更改全局变量'doSome'的值,并且间隔将开始调用新函数。在第二个版本中,你不能这样做。 – 2011-12-15 09:31:24

2

不,在事件循环被清除之前,时间间隔不能执行,所以如果你做了例如setInterval(func, 1000); for(;;)那么间隔永远不会运行。如果其他浏览器选项卡在同一个线程中运行(因为它们的确无处不在(?)除了铬,那么同样适用,如果这些标签堵塞事件循环。)

但对于大如60000它是在一个区间至少很有可能在合理的时间内调用func。但没有保证。

0

关于“准确的时间安全性”:以下代码以RefreshInterval毫秒的间隔开始UpdateAll,每秒调整一次,以便在第二秒的开始时每秒发生一次启动。计算机的有限速度会稍稍延迟,但错误不会累积。

function StartAtEachSecond() 
{ 
    var OneSecond = 1000; // milliseconds 
    var MinInteral = 50; // milliseconds, estimated safe interval 
    var StartTime = OneSecond - (new Date()).getMilliseconds(); // Time until next second starts. 
    if (StartTime < MinInteral) StartTime += OneSecond 
    window.setTimeout (StartAtEachSecond, StartTime + MinInteral); // To set up the second after the next. 
    for (var Delay = 0.0; Delay < OneSecond - MinInteral; Delay += RefreshInterval) 
    { 
     window.setTimeout (UpdateAll, StartTime + Delay); // Runs during the next second. 
    } 
}