泄漏的原因是什么?

时间:2018-11-27 20:37:29

标签: javascript memory-leaks

如何解决此代码中的内存泄漏? 泄漏的原因是什么?

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);

1 个答案:

答案 0 :(得分:1)

问题在于,每次调用replaceItem时,都会增加对象链,因为该函数内部具有指向priorItem的指针,该指针指向先前保存在{{ 1}}全局变量(外部函数)。因此,第n个函数调用具有指向第(n-1)个函数调用的结果的指针-以及以这种方式创建的指针链-JS垃圾收集器不会清除该链(除非您将null设置为开始-全局theItem和停止通话功能)。

theItem对象包含theItem,该对象在范围内包含someMethod的先前值(包含进一步的先前值...依此类推...)。

这将在this modified code中更明显-我们在chrome中调试它:

enter image description here

我不知道您的目的是什么,只是通过例如删除theItem函数体内的var priorItem = theItem;行(并保存功能更改replaceItem到{{ 1}})。