说实话,我们需要快速查看你复制的一些测试代码,但我大致知道你正在经历什么。如果我错了并且你可以提供证明此事的测试代码,请告诉我。
正如你已经知道的那样,“清理” Javascript 希望不再有对要释放的项目的引用。
一个简单的例子:
var myObj = {
data : 'test'
};
var myData = myObj.data;
myObj = 'something else';
console.log( myData );
您的代码可能比这更加复杂,但是这可以帮助解释一下,在某个地方,垃圾可能无法被收集,因为作用域链可以被跟踪到一个引用。
考虑以下内容:
function oops(text){
function doStuff(){
return text.toLowerCase();
}
return doStuff();
}
var test = oops('closure');
< p > 函数
doStuff
不会被垃圾回收,因为它被
test
引用。 < /p >
var test2 = oops('closures...');
var test3 = test2;
test = 0;
test2 = 0;
test3 = 0;
这实际上是我们创建的内存泄漏。每次调用oops
时,您都会创建一个带有唯一标识符的函数对象doStuff
。
避免这种情况的方法可能是
function doStuff( text ){
return text.toLowerCase();
}
function oops( text ){
return doStuff();
}
var test = oops( 'closure' );
现在我们没有内存泄漏了。doStuff
被调用而不是被创建。
仔细查看你的代码,你可能会发现你在某个地方做了这件事。
如果你正在处理元素,我认为你可能正在这样做,IBM有一篇关于循环引用的好文章,你可能想看一下。
现在已经很晚了,其中一些内容未经测试,但是理论依然存在,如果我拼错了什么,请让我知道,明天我可以查看,以便日后来访者使用。