如何解决此代码中的内存泄漏? 泄漏的原因是什么?
var theItem = null;
var replaceItem = function() {
var priorItem = theItem;
var writeToLog = function() {
if (priorItem) {
console.log("hi");
}
};
theItem = {
longStr: new Array(1000000).join('*'),
someMethod: function() {
console.log(someMessage);
}
};
};
setInterval(replaceItem, 1000);
答案 0 :(得分:1)
问题在于,每次调用replaceItem
时,都会增加对象链,因为该函数内部具有指向priorItem
的指针,该指针指向先前保存在{{ 1}}全局变量(外部函数)。因此,第n个函数调用具有指向第(n-1)个函数调用的结果的指针-以及以这种方式创建的指针链-JS垃圾收集器不会清除该链(除非您将null设置为开始-全局theItem
和停止通话功能)。
theItem
对象包含theItem
,该对象在范围内包含someMethod
的先前值(包含进一步的先前值...依此类推...)。
这将在this modified code中更明显-我们在chrome中调试它:
我不知道您的目的是什么,只是通过例如删除theItem
函数体内的var priorItem = theItem;
行(并保存功能更改replaceItem
到{{ 1}})。