JavaScript setTimeout 如此不准确的原因是什么?

2024-01-10

我在这里得到了这段代码:

var date = new Date();
setTimeout(function(e) {
    var currentDate = new Date();
    if(currentDate - date >= 1000) {
         console.log(currentDate, date);
         console.log(currentDate-date);
    }
    else {
       console.log("It was less than a second!");
       console.log(currentDate-date);
    }
}, 1000);

在我的电脑上,它总是正确执行,控制台输出为 1000。有趣的是,在其他计算机上,相同的代码,超时回调在不到一秒的时间内启动,并且差异currentDate - date介于 980 和 998 之间。

我知道存在解决此错误的库(例如,Tock https://github.com/mrchimp/Tock).

基本上,我的问题是:原因是什么因为setTimeout在给定的延迟时间内不触发?难道是计算机太慢而浏览器自动尝试适应缓慢并触发之前的事件?

PS:下面是在 Chrome JavaScript 控制台中执行的代码和结果的屏幕截图:


它不应该特别准确。有许多因素限制了浏览器执行代码的速度;引用自MDN https://developer.mozilla.org/en-US/docs/Web/API/Window.setTimeout#Notes:

除了“限制”之外,当页面(或操作系统/浏览器本身)忙于其他任务时,超时还可以稍后触发。

换句话说,这样的方式setTimeout通常是实现的,它只是为了在给定的延迟后执行,and一旦浏览器的线程空闲就可以执行它。

然而,不同的浏览器可能以不同的方式实现它。以下是我所做的一些测试:

var date = new Date();
setTimeout(function(e) {
    var currentDate = new Date();
    console.log(currentDate-date);
}, 1000);

// Browser Test1 Test2 Test3 Test4
// Chrome    998  1014   998   998
// Firefox  1000  1001  1047  1000
// IE 11    1006  1013  1007  1005

也许 Chrome 中的 Date类型,或者 Chrome 可能使用不同的策略来决定何时执行代码 - 也许它试图将其放入最近的时间段,即使超时延迟尚未完成。

简而言之,你不应该使用setTimeout如果您期望可靠、一致、毫秒级的计时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript setTimeout 如此不准确的原因是什么? 的相关文章

随机推荐