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

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中调试它:

javascript - 泄漏的原因是什么?-LMLPHP

我不知道您的目的是什么,只是通过例如删除replaceItem函数主体内的行if (priorItem) {(以及将功能if (theItem) {更改为)来中断该链。

10-06 11:10