传递setInterval或setTimeout是否可以安全地进行小数延迟?

时间:2011-12-12 00:52:00

标签: javascript cross-browser settimeout setinterval

我知道由于浏览器计时器不准确,差异目前可以忽略不计,但为了知识,如果没有别的:是否有任何支持setInterval和setTimeout的浏览器,但要求它们作为延迟传递整数值?

或者,用例子改写,是:

setInterval(animate,50/3);

作为跨浏览器兼容吗?

setInterval(animate,17);

4 个答案:

答案 0 :(得分:7)

非常安全。

(如RobG指出的,我还没有提供到DOM / JS桥的参考规则本身他敦促谨慎FWIW,相信 - 但没有参考决定性地状态 - 即ToInteger 接口桥的一部分。这是一个jsfiddle,显示超时传递为字符串,浮点数和整数(与JS中的float类型相同),在FF8中工作正常和IE9。欢迎反馈。)

这是因为the DOM interface only accepts integers setTimeout/setInterval的延迟,因为它们是在DOM中定义的,而不是在ECMAScript中定义的。延迟值首先适当地转换为整数值(在这方面,[JS-internal] ToInteger函数被调用执行截断 *)。

但是,示例数字实际上会产生略有不同的结果(尽管可能不太明显): - )

这是因为,50/316.66andsomemore - > 16)和17 指定了不同的超时

快乐的编码。


* ToInteger定义为sign(number) * floor(abs(number)),不包括特殊情况。请参见第5版ECMAScript规范的第9.4节。

答案 1 :(得分:3)

Javascript在浮点数和整数之间没有真正的区别,并且在引擎盖下是相同的数据类型。 11.0在内存中有点相同。

因此,是的,您可以传递小数值而不会出现任何实际问题。这是完全有效的JavaScript。即使它确实需要一个整数,它更可能只是为你简单而无声地舍入它。

但是不要指望它是准确的! 0.11甚至4.87的时间都可能会非常接近同时由于回调调度的粒度较低。

答案 2 :(得分:0)

我认为第二个参数将被计算为表达式,只要它返回一个数字就可以了。它似乎适用于chrome。只要确保你不要除以零!

答案 3 :(得分:0)

这些函数需要毫秒。我怀疑你可以期待任何超过10毫秒的准确度,以及浏览器enforce timer restrictions

Firefox并不介意十进制值。您can test在您感兴趣的任何其他浏览器中。