我正在编写一个Javascript计数器函数,但我不太确定。
假设1000ms === 1s。
var ms = 0;
var s = 0;
setInterval(() => {document.querySelector('#ms').innerHTML = ms++}, 1);
setInterval(() => {document.querySelector('#s').innerHTML = s++}, 1000);

<div id="ms">0</div>
<div id="s">0</div>
&#13;
假设从0到1000运行的毫秒函数的速度与从0到1运行的第二个函数的速度相同,但结果似乎是1000ms!== 1s。我误解了一些关于毫秒的事情吗?
非常感谢!
答案 0 :(得分:3)
它不会那样工作。定义计时器(setTimeout或setInterval)时,JS引擎不保证它将在1,000毫秒内运行,因为它取决于它在队列中的处理。
此外,如果任务已存在,则计时器不会在队列中添加任务。这意味着如果计时器到期并且该计时器的队列中已经有一个实例,那么它不会再次添加。
我推荐你这本书:https://www.amazon.com/dp/1617292850/?tag=stackoverflow17-20。它有一章关于事件,它准确地解释了你的要求。
答案 1 :(得分:0)
与所有应用程序一样,Web浏览器轮流使用一块CPU 时间和他们必须等待的时间将根据负载而变化。 这就是导致异步定时器延迟的原因 - 一个200ms的定时器 实际上可能需要202ms,或204,这将逐渐发送 秒表没时间了。
在这种情况下的解决方案是不依赖于计时器的速度 所有,而是,每个循环新查询系统时间并派生 那个输出。
来源:Sitepoint