秒表不工作,它的速度太快了

时间:2014-10-03 08:37:13

标签: javascript

当我在JS中寻找一个简单的秒表实现时,我发现了这段代码http://codepen.io/_Billy_Brown/pen/dbJeh/ 问题是它工作不正常,时钟太快了。当我的手表只有23秒时,屏幕上有30秒钟。 我不明白为什么。定时器功能每毫秒调用一次,应该正确更新时间。

setInterval(this.timer, 1);

问题来自浏览器还是来自JS代码。

提前致谢。

2 个答案:

答案 0 :(得分:1)

Javascript中的计时器没有毫秒精度。

间隔的最短时间因浏览器和浏览器版本而异。最近的浏览器的典型最小值为4毫秒,而较旧的浏览器则为10毫秒。

此外,您无法在您指定的时间完全依赖于回调。 Javascript是单线程的,这意味着如果其他代码在计时器触发勾选时运行,则必须等到其他代码完成。

答案 1 :(得分:-1)

实际上,您提供的代码是模仿时间流,但它与系统时间不同步。

每毫秒它只调用函数this.time,它执行毫秒,秒等的重新计数 没有得到本机系统时间,只是将1加到表示“虚数毫秒”的变量上。 所以我们可以说你看到的伪时间取决于你的CPU,浏览器以及谁知道还有什么。

在我们现代速度极快的计算机上,this.time函数的主体执行速度超过毫秒(想知道在板载IE5的Pentium 2上会发生什么)。 无论如何,this.time在所有计算机和浏览器上都没有机会在特定的固定时间段内执行。

根据系统时间显示自起点以来经过的时间的最简单正确方法是:

<body>
<script>
var startTime = new Date() // assume this initialization to be start point

function getTimeSinceStart()
{
  var millisSinceStart = new Date() - startTime
    , millis = millisSinceStart % 1000
    , seconds = Math.floor(millisSinceStart / 1000)

  return [seconds, millis].join( ':' )
}

(function loop()
{
  document.title = getTimeSinceStart() // look on the top of page

  setTimeout( loop, 10 )
}())
</script>
</body>

P.S。 @Guffa在他的回答中说的是正确的(通常用于浏览器中的js),但在这种情况下它并不重要而且不会影响问题