这确实是一个非常简单的问题。如果我使用setInterval(something, 1000),是否可以完全确定在31天后会触发“某事”的确切60*60*24*31时间?还是有所谓的漂移风险?
3 回答

倚天杖
TA贡献1828条经验 获得超3个赞
您可以在Firefox中运行以下基准测试:
var start = +new Date();
var count = 0;
setInterval(function () {
console.log((new Date() - start) % 1000,
++count,
Math.round((new Date() - start)/1000))
}, 1000);
第一个值应尽可能接近0或1000(其他任何值都表明触发器的计时是“偏离原点”。)第二个值是代码被触发的次数,第三个值是多少次被触发可能应该触发了。您会注意到,如果您占用CPU的话,它可能会脱节,但似乎可以自行纠正。尝试将其运行更长的时间,并查看其处理方式。

皈依舞
TA贡献1851条经验 获得超3个赞
简短的回答:不,您不能确定。是的,它会漂移。
长答案:John Resig关于JavaScript时间的准确性以及JavaScript计时器的工作原理。
从第二篇文章:
为了了解计时器在内部的工作方式,有一个重要的概念需要探讨:不能保证计时器的延迟。由于浏览器中的所有JavaScript都在单线程上执行,因此异步事件(例如鼠标单击和计时器)仅在执行中存在空缺时才运行。
这两篇文章(以及该站点上的任何内容)都很好阅读,因此请阅读。
添加回答
举报
0/150
提交
取消