5 javascript cross-browser settimeout setinterval
我知道由于不准确的浏览器计时器,差异目前可以忽略不计,但为了知识,如果没有别的:是否有任何支持setInterval和setTimeout的浏览器,但要求它们作为延迟传递整数值?
或者,用例子改写,是这样的:
setInterval(animate,50/3);
Run Code Online (Sandbox Code Playgroud)
作为跨浏览器兼容吗?
setInterval(animate,17);
Run Code Online (Sandbox Code Playgroud)
小智 7
这是非常安全的.
(正如RobG所指出的那样,我没有提供DOM/JS桥接规则本身的参考,他敦促谨慎.我相信FWIW - 但没有提到最终状态 - 这ToInteger 是接口桥的一部分.是一个jsfiddle显示超时作为字符串,浮点数和整数(与JS中的浮点类型相同)传递,在FF8和IE9中工作正常.欢迎反馈.)
这是因为DOM接口只接受延迟的整数setTimeout/setInterval - 是的,这些是在DOM中定义的,而不是在ECMAScript中定义的.首先将延迟值适当地转换为整数值(在这方面,ToInteger调用[JS-internal] 函数执行截断*).
但是,示例数字实际上会产生略微不同的结果(尽管可能不是很明显):-)
这是因为,50/3(16.66andsomemore- > 16)并17 指定不同的超时.
快乐的编码.
*ToInteger被定义为sign(number) * floor(abs(number)),不包括特殊情况.请参见第5版ECMAScript规范的第9.4节.
JavaScript 对浮点数和整数没有真正的区别,并且在底层是相同的数据类型。 1和1.0在内存中是逐位相同的。
因此,是的,您可以传递小数值而不会出现任何实际问题。这是完全有效的 JavaScript。即使它确实需要一个整数,它也更有可能简单地、默默地为您舍入它。
但不要指望它是准确的! 由于回调调度的粒度较低,时间0.1,1甚至4.87可能会在非常接近的同一时间触发。