JavaScript setInterval和setTimeout计时问题

时间:2015-07-06 14:26:05

标签: javascript settimeout setinterval timing

请参阅以下JavaScript代码:

var cis_current_time = 0;

setInterval(function() {
    cis_current_time += 1;
},1);

$("#timingInfo").html(cis_current_time);
setTimeout(function() {
    $("#timingInfo").html($("#timingInfo").html() + ', ' + cis_current_time);
},1000);

结果我除了得到0,1000,但它返回0,数字接近200

请检查fiddle.

这种行为的原因是什么?

2 个答案:

答案 0 :(得分:1)

由于设计的原因,

setIntervalsetTimeout可能不准确。

它们由浏览器引擎执行,这意味着浏览器可以在某些情况下限制它们。举个例子,如果你的浏览器只使用一个进程来处理JavaScript,那么它们可能会被限制,或者可能比你定义的更多,因为当前使用的核心压力很大。

使用多线程JavaScript可以稍微改进一下,但无论如何 - 它们不会100%准确。

setInterval仅保证在给定时间段内执行/调用after。不是在确切的时间。每个区间可能存在差异。

答案 1 :(得分:0)

setInterval函数非常精确,正如您在fiddle上看到的那样。

问题在于你的代码,你试图每毫秒执行一个函数。

setInterval(function() {
    cis_current_time += 1;
},1);

JavaScript是单线程的,然后,当它有很多指令时,它会堆叠它们并在它有可能时调用它们,所以,这就是为什么它在你的情况下不准确。

setInterval 问题,JavaScript :JS可以执行函数,这就是以后执行的原因...... 每个函数都关注这个问题,所以setInterval也是......

Func(1)耗时70ms:

enter image description here

如果Func(1)需要130ms:

enter image description here

setInterval是精确的,但与JS中的每个函数有相同的问题

Image credits