当我在JS中寻找一个简单的秒表实现时,我发现了这段代码http://codepen.io/_Billy_Brown/pen/dbJeh/ 问题是它工作不正常,时钟太快了。当我的手表只有23秒时,屏幕上有30秒钟。 我不明白为什么。定时器功能每毫秒调用一次,应该正确更新时间。
setInterval(this.timer, 1);
问题来自浏览器还是来自JS代码。
提前致谢。
答案 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),但在这种情况下它并不重要而且不会影响问题