2012-09-28 48 views
18

我在用下面的代码在Firefox 15和Chrome 21问题:setInterval的最大延迟是多少?

setInterval(function() { console.log('test') }, 300000000000) 

在这两种浏览器,运行该功能就非常迅速地重复。当然,这是一个很大的数字(代表大约10年后),但我不希望它被视为微小或负数。我没有看到任何文档中允许的最大延迟时间。有谁知道是否有标准的最大值,或者这是否只是浏览器有趣?

+2

我怀疑数量可强制转换为32位整数沿途某处... – Pointy

+0

@Pointy,这可能是一个很好的猜测。嗯...: -/ – Nogwater

+0

@Pointy。它看起来像2^31-1是安全的,但2^31休息,所以你几乎肯定是正确的。如果你将此作为答案发布,我会给你业力。 – Nogwater

回答

10

我目前找不到任何文档,但如果计时器值必须符合32位有符号整数,我不会感到惊讶。

+0

这是正确的。 setInterval()失败,值大于32位signed int。 –

4

我认为最大延迟是2 -1这是2,147,483,647ms。以毫秒为单位的有符号32位整数的最大值。如果它未被签名,它将是2 -1 = 4,294,967,295。

+0

2亿147百万。 – gr3g

+1

类型签名的好处。 – rekire

20

该间隔存储在一个带符号的32位int(在Google Chrome浏览器中的测试实现中:V8),因此您看到的行为是间隔溢出到负数的结果(在这种情况下,表现得好像区间为0)。因此,您可以使用的最大时间间隔是2**31 - 1

以下是我确定这是事实:

setInterval(function(){console.log("hi");}, Math.pow(2,31)); 

行为类似于间隔为0

setInterval(function(){console.log("hi");}, Math.pow(2,31) - 1); 

在我愿意等待的时候不开火。

setInterval(function(){console.log("hi");}, Math.pow(2,33) + 1000); 

行为像间隔是1000(一秒)。在这里,2**33不影响前32位,所以我们只得到1000

尽可能高的间隔,2**31-1ms有点害羞25天,所以绰绰有余。

+0

该特定实现*中的间隔*存储在..中,但是显示所用方法的+1。 – 2012-09-28 04:32:29

+0

不错的例子测试。在我对这个问题本身的评论中,我基本上做了同样的工作,但是+1表示你的工作。 :) – Nogwater

0

Max是2,147,483,647(2 -1)

要小心,如果你做比数字越大,它会立即运行(你把负值成像,因此浏览器将运行无限环)

setInterval(()=>console.log('n'),2147483647) 
31 
setInterval(()=>console.log('y'),2147483648) 
38 
(1588) y