javascript设置间隔

javascript设置间隔,javascript,Javascript,一个问题。如果我以这种方式使用setInterval: setInterval('doSome();',60000); 即使我在浏览器中更改了选项卡,doSome()功能每60秒触发一次是否安全?如果带有setInterval()功能的选项卡保持打开状态,则该功能将每60秒执行一次,即使您切换到或打开其他选项卡 是的,它适用于我刚刚创建的一个示例 是的,浏览器的焦点是不相关的 但是,不应使用字符串参数来setInterval。改为使用对函数的引用: setInterval(doSome, 60

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

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

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

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

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


是的,浏览器的焦点是不相关的

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

setInterval(doSome, 60000);

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


事件将在设定的时间值附近触发,但不会精确到毫秒。即使当时没有运行其他事件,错误也可能会持续数十毫秒。这可能是一个问题,例如,如果您有一个长时间运行的流程,其中时间非常重要。如果这样做,您将需要每隔一段时间与时钟同步一次。

是的,只要页面处于打开状态,它就会被调用,无论切换选项卡还是最小化浏览器

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

应该是>


setInterval(doSome,60000)
将字符串传递给
setInterval
很好,这是使用
setInterval
的两种方法之一,另一种是传递函数指针。与其他答案状态一样,它在任何方面都没有错误,但是它没有那么有效(因为代码必须重新解析),也不符合您的目的。两者

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

是正确的,尽管它们的含义稍有不同。如果
doSome
是某个非全局作用域的本地,则从同一作用域中调用后者将以60000ms的间隔运行本地
doSome
。调用前一个代码将始终在全局范围内查找
doSome
,如果全局范围内没有
doSome
函数,则调用将失败

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

所有浏览器都将间隔值钳制为至少一个特定的值,以避免间隔过于频繁(我想它至少是10毫秒或4毫秒之类的,我记不清了)


注意,一些浏览器(即将推出的Firefox 5就是其中之一,但可能还有其他我不知道的浏览器)进一步将
setInterval
大幅钳制到1000毫秒(如果选项卡未聚焦)。()

否,在清除事件循环之前,间隔无法执行,因此如果执行,例如
setInterval(func,1000);对于(;;)
,则间隔将永远不会运行。如果其他浏览器选项卡在同一线程中运行(就像它们在除chrome之外的任何地方运行一样(?),那么如果这些选项卡阻塞事件循环,则同样适用。)

但是对于像
60000
这样的间隔,至少很可能在合理的时间内调用func。但是没有保证。

关于“精确时间安全”:以下代码以
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.
    }
}
函数StartAtEachSecond()
{
var OneSecond=1000;//毫秒
var MinInteral=50;//毫秒,估计的安全间隔
var StartTime=OneSecond-(new Date()).getmillizes();//直到下一秒开始的时间。
如果(开始时间<最小内部)开始时间+=1秒
window.setTimeout(StartAtEachSecond,StartTime+MinInteral);//设置下一个之后的第二个。
对于(var延迟=0.0;延迟<1秒-最小间隔;延迟+=刷新间隔)
{
window.setTimeout(UpdateAll,StartTime+Delay);//在下一秒运行。
}
}

您不应该向
setInterval
传递字符串,而应该传递函数:
setInterval(doSome,60000)setInterval(function(){doSome(12345);},60000)当然。我建议您改为键入setInterval(doSome,60000),这样效率更高。传递给
setInterval
的字符串可以。不同之处在于它们的计算方式和作用域。传递到
setInterval
的字符串可以。区别在于它们是如何计算的,从什么范围计算的。@Delan和它的速度,语法突出显示,以及需要做一些愚蠢的事情,比如转义引号。将字符串传递到
setInterval
本身并没有错,只是无脑而已。这是真的,我同意你的看法。传递到
setInterval
的字符串很好。区别在于它们的计算方式和范围。还有一个区别——在第一个版本中,您可以更改全局变量
doSome
的值,间隔将开始调用新函数。在第二个版本中,你不能这样做。
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.
    }
}