javascript – Chrome setInterval在10000毫秒时崩溃

我正在开发一个
Javascript秒表应用程序,它适用于除Chrome之外的所有浏览器.

这是一个小提琴:
http://jsfiddle.net/djwelsh/Sxyy8/

从理论上讲,它非常简单.单击“开始”按钮会记录epoch time in milliseconds,并启动setInterval.在每个间隔上,从当前纪元时间中减去该起始纪元时间.这给我们留下了一个以毫秒为单位的值,它被转换为h:m:s:cs并显示在页面上.

问题

我的问题在于Chrome.每次计时器达到10000毫秒时,选项卡都会出现“Aw,snap”消息.

一个奇怪的方面是,如果你点击停止,等待几秒钟,然后再次点击开始,崩溃仍然会发生.这似乎表明它是一个内存问题 – 有些东西正在填补它不能再容纳的地步,并且溢出.但是在开发工具和资源监视器中检查内存都没有任何异常.

可能的解决方案

通过将间隔值更改为大于100毫秒的数字(我想要使用的默认值为50)可以避免此问题.由于某种原因,也可以通过在控制台中记录计时器值来避免它.

麻烦的是,除非我知道它为什么会发生,否则我无法确信这些快速解决方案实际上是在解决问题.在我知道它可以在所有当前浏览器中运行之前,我不想发布该页面.

我知道这似乎是一个相当狭窄的问题,但我希望这个解决方案能够揭示一些可能对其他人有帮助的东西(Chrome的计时器功能或其他东西的特质).

编辑
顺便说一句,我知道停止并重新启动计时器并不像真正的秒表那样工作;我尚未完成该部分的实施.我认为最好尽量保持SO尽可能简单.

供参考(和正义),这是更新版本.仍在10000崩溃:
http://jsfiddle.net/djwelsh/Sxyy8/7/


根据@Akhlesh的回答,我更新了小提琴.它现在运行正常,就像一个秒表:http://jsfiddle.net/djwelsh/Sxyy8/18/

如果您想知道,我需要使用基于纪元的技术(而不是仅仅增加基值),因为有时内存使用问题导致间隔不会每秒调用 – 如果选项卡移动到背景而例如,计时器仍在运行.

最佳答案 您可以通过将时间变为全局来避免选项卡崩溃,而不是再次在Update函数中再次创建这些变量.

  var uTime,uNow;
  //Update function will use same variable to initialize time and now 
  updateTime: function () {
     uNow = Date.now();
     oO.milliseconds = uNow - oO.epoch;
     uTime = oO.getTimeObject(oO.milliseconds);
     oO.el.testClock.text('' + uTime.h + ':' + uTime.m + ':' + uTime.s + ':' + uTime.ms + '');
  }

Fiddle Demo

我不确定原因,但我认为GC无法解除分配这些变量,同时分配新变量并导致崩溃.

点赞