如何解决此代码中的内存泄漏?
泄漏的原因是什么?
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);
最佳答案
问题在于,每次调用replaceItem
时,都会增加对象链,因为该函数内部具有指向priorItem
的指针,该指针指向先前保存在theItem
全局变量(外部函数)中的函数调用的结果。因此,第n个函数调用具有指向第(n-1)个函数调用的结果的指针-以及以这种方式创建的指针链-JS垃圾收集器不会清除该链(除非您将null设置为开始-全局theItem
和停止调用功能)。theItem
对象包含someMethod
,该theItem
在范围内包含var priorItem = theItem;
的先前值(其包含其他先前值...依此类推...)。
这将在this modified code中更明显-我们在chrome中调试它:
我不知道您的目的是什么,只是通过例如删除replaceItem
函数主体内的行if (priorItem) {
(以及将功能if (theItem) {
更改为)来中断该链。