setInterval('doSome();',60000);
我是否安全,即使我在浏览器中更改了标签,也会每60秒触发一次doSome()
功能?
答案 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)
是的,它适用于我刚创建的一个例子。
答案 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.
}
}