javascript setInterval

时间:2011-04-27 08:55:11

标签: javascript

一个问题。如果我以这种方式使用setInterval:

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

我是否安全,即使我在浏览器中更改了标签,也会每60秒触发一次doSome()功能?

8 个答案:

答案 0 :(得分: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函数,则会失败。

无论选项卡焦点如何,都会可靠地触发该功能,间隔为 至少 60000ms ,但由于开销和延迟,通常会稍微更多。

所有浏览器都会将间隔值限制为至少一定值,以避免间隔过于频繁(我认为它至少为10毫秒或4毫秒或其他东西,我不能完全记住)。< / p>

请注意,某些浏览器(即将推出的Firefox 5是一个,但可能还有其他我不知道的浏览器)会进一步限制setInterval如果选项卡未聚焦,则为1000毫秒。 (Reference

答案 1 :(得分:2)

不,在清除事件循环之前,间隔不能执行,因此如果您执行setInterval(func, 1000); for(;;),则间隔将永远不会运行。如果其他浏览器选项卡在同一个线程中运行(因为它们在任何地方(?)除了在chrome中,那么如果这些选项卡阻塞了事件循环,则同样适用。)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

是的,它适用于我刚创建的一个例子。

http://jsfiddle.net/5BAkx/

答案 4 :(得分:0)

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

但是,您不应该使用setInterval的字符串参数。改为使用对函数的引用:

setInterval(doSome, 60000);

答案 5 :(得分:0)

不,你不能保证准确的时间安全。 JS是基于事件的(并且是单一的),因此事件不会在恰当的时刻触发,特别是如果您在页面上同时运行其他代码则不会。

事件将在设定的时间值附近触发,但不会在精确的毫秒内触发。即使当时没有其他事件正在运行,该错误也可能是几十毫秒。如果您有一个长时间运行的过程,时间很重要,这可能是一个问题。如果这样做,您需要偶尔与时钟同步。

答案 6 :(得分:0)

是的,只要页面打开,它就会被调用,无论选项卡是否被切换,甚至浏览器都被最小化。

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

应该是&gt;

setInterval(doSome, 60000)

答案 7 :(得分:0)

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

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.
    }
}