window.setInterval是否有最大延迟限制?

16
今天我遇到了一个有趣的问题,与window.setInterval有关。当使用足够大的延迟(在本例中为30天的毫秒数)时,它每秒执行一次,而不是每30天执行一次。已在最新的Chrome和Firefox中测试。

jsFiddle链接

window.setInterval(function() {
    document.getElementById("first").innerHTML = new Date().toString();
}, 5000);
window.setInterval(function() {
    document.getElementById("second").innerHTML = new Date().toString();
}, 2592000000);

我无法找到关于 setInterval 中延迟的最大值的权威文档,并且 MDN 文档 没有提到任何相关信息。其他在线资源表明,延迟应该能够适应任何有符号 32 位整数。

window.setInterval 中的延迟参数是否有最大值?如果有,它是多少?


请注意:标准不会限制超时参数的类型/范围 https://www.w3.org/TR/2011/WD-html5-20110525/timers.html#timers(如果我错了,请纠正我) - zerkms
它似乎确实出现在2147483648(这是最小的正整数,不是32位有符号整数)的位置。 - Paul
1
在Aaron Dufour的回答中解释了这里:https://dev59.com/2mcs5IYBdhLWcg3wtmOf - Wake
不会发生在Opera 12中。 - Bergi
1个回答

10
根据公共Wiki MDN上 setTimeout 文档 的说法,确实存在最大值限制,尽管它似乎不是“官方”的 - 限制是一个带符号的32位整数。

最大延迟值

包括Internet Explorer,Chrome,Safari和Firefox在内的浏览器将延迟存储为32位有符号整数,这会导致使用大于2147483647的延迟时整数溢出,从而立即执行超时。

2592000000 的值确实大于 2147483647,因此会导致溢出。


4
根据setTimeout的文档,它并不是“setTimeout文档”,而是公共维基百科。 - zerkms
2
@zerkms 由于MDN比官方规范更易读,因此通常被认为是一个不错的代理。而且像这样包含实现注释使其更加实用。 - Barmar
2
@zerkms,这只是“非官方文档”,但它仍然是一份文档,因为(有可能达到语义饱和的风险)该页面记录了setTimeout函数的行为。无论谁编写了它,它仍然是一个关于该函数的描述。 - VLAZ
2
@Vld 我在某种程度上同意你的观点。但对我来说,这似乎有点误导。(当谈到标准时,它们需要在术语上达到200%的准确性) - zerkms
@zerkms 很好 - 我已经指定它是MDN。 - VLAZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接