给setInterval或setTimeout传递一个分数延迟是否安全?
Is it safe to pass setInterval or setTimeout a fractional delay?
我知道由于浏览器计时器不准确,这种差异目前可以忽略不计,但是为了了解情况:是否有任何浏览器支持setInterval和setTimeout,但要求将它们作为延迟传递一个整数值?
或者,用例子重新表述,是这样的:
setInterval(animate,50/3);
是跨浏览器兼容的吗?
setInterval(animate,17);
绝对安全。
(正如RobG指出的那样,我没有提供DOM/JS桥规则本身的参考,他敦促谨慎。据我所知,我相信——但没有确凿的证据——ToInteger
是接口桥的部分。这里是一个jsfiddle,显示超时作为字符串,浮点数和整数(与JS中的float类型相同)传递,在FF8和IE9中工作良好。欢迎反馈。)
这是因为 DOM接口只接受整数作为setTimeout/setInterval
中的延迟——是的,这些是在DOM中定义的,而不是在ECMAScript中。延迟值首先被适当地转换为整数值(在这方面,调用[JS-internal] ToInteger
函数执行截断*)。
然而,示例数字实际上会产生略有不同的结果(尽管可能不太明显):-)
这是因为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
的时间都可能在非常接近的时间内触发。
我认为第二个参数将作为一个表达式计算,只要它返回一个数字就可以工作。它似乎工作在铬。只要确保你没有除以0 !
这些函数期望毫秒。我怀疑你能期望任何精度超过10ms,并且浏览器强制计时器限制。
Firefox不介意十进制值。你可以在任何你感兴趣的浏览器中进行测试。
这取决于,取决于参数delay
是否转换为整数,是否使用累积延迟[^1]策略,取决于您是否使用电池供电的设备和省电模式。
测试setInterval
,延迟1000/15~=66.6667,持续时间60s,页面始终可见(不切换到背景,不关闭屏幕),使用以下浏览器:
- Windows Chrome 108 Android Chrome 107iOS Safari 16.0
- Windows Firefox 107
- Android Firefox 108 Beta
参见CodePen setInterval实际间隔测试
setInterval
的实际平均间隔时间
- 如何在一个元素动画之后延迟
- 如何将一个方法延迟到另一个方法首先完成,javascript
- JavaScript/jQuery-添加添加和删除类与下一个函数之间的延迟
- 在单击下一个按钮之前,在JavaScript代码中添加5秒的延迟
- 从另一个函数延迟解析的返回
- 如何在另一个任务中正确使用延迟的gump任务返回的值
- jQuery动画的持续时间就像一个延迟
- 是否有一个Javascript函数可以使代码在运行时延迟
- jQuery-在窗口滚动上运行一个函数,没有任何延迟
- jQuery/Javascript函数延迟运行,直到另一个函数完成(如果需要)
- 节点 js 从客户端和另一个节点模块调用相同的延迟函数
- 在 Javascript/jQuery 中的循环末尾添加一个延迟
- 如何使用 window.open 创建一个不确定延迟的弹出窗口(用于社交身份验证),而弹出窗口阻止程序会阻止它
- 我怎样才能使数组一次显示一个延迟
- 使用$(“[property=value]”).click(),我希望两次单击之间有一个延迟
- 跳过一个延迟的对象
- jQuery鼠标悬停函数对多个元素执行一个延迟
- 如何在函数中使用何时按顺序发送文件上传,这也是一个延迟承诺
- 是否有一个延迟的javascript下载/解释,是触发所需的函数被调用
- 有没有一种方法可以在jQuery中创建一个延迟的对象包装器?