2011-09-24 70 views
4

http://jsfiddle.net/mplungjan/SyHFR/IE8内存泄漏?

对不起乱码 - 我已经修改不是我,最初是从动态驱动器选择了一个脚本 - 它由别人我帮助和宁可改写从无到有整个事情,我同意功能蠕变。预期的变化是增加一个重复之后,并通过变量的延迟

现在我只想了解哪里可能会有问题 - 我改变了代码从每秒使用一个日期对象只在初始化时才使用它。

代码

cdtime.prototype.updateTime=function(){ 
    var thisobj=this; 
    this.currentTime+=1000; // one second 
    setTimeout(function(){thisobj.updateTime()}, 1000) //update time every second 
} 

给出

消息: 'thisobj' 为空或不是对象

在IE8约9小时后在XP

我现在自己在周末的另一个盒子上运行它,但想知道是否有人可以启发我关于IE可能会出现什么问题。

HMM - 粘贴功能现在,我看到settimeout是在一个原型中 - 突然看起来不正确。

请随时指点我一个更好的柜台,可以做这个人正在做的事情,例如,延迟后开始,在给定时间后重复,并在CSS样式的页面上有多个计数器。

UPDATE

尝试的setInterval使得整个coundown非常波涛汹涌 http://jsfiddle.net/mplungjan/z2AQF/

+1

嗨,你真的想通过修改代码创建什么?这可能有助于回答。 –

+0

刚刚添加延迟和重复 – mplungjan

+0

我不是100%确定,但不创建该setTimeout引用thisobj匿名函数,导致该函数不符合gc资格? –

回答

1

如果真的是内存泄漏,尝试从传递给setTimeout功能清除thisobj变量:

cdtime.prototype.updateTime = function() { 
    var thisobj=this; 
    this.currentTime+=1000; // one second 
    setTimeout(function() { 
     thisobj.updateTime(); 
     thisobj = null; 
    }, 1000); //update time every second 
}; 

如果你仔细观察,这个函数基本上是一个间隔,所以下面的代码会更加优化,因为它不会叠加在旧函数上:

cdtime.prototype.updateTime = function() { 
    var thisobj = this; 
    setInterval(function() { 
     thisobj.currentTime += 1000; 
    }, 1000); 
}; 
+0

使用间隔使计数器非常波涛汹涌,不准确 – mplungjan

+0

我想要删除thisobj。我不太明白我可以做到这一点。 – mplungjan

+0

即使没有任何事情发生,'delete thisobj'可能会返回'true'。 'var thisobj'将不起作用,因为它是使用'var'声明的。清除参考的正确方法是将其设置为“空”。 – Lekensteyn