我不明白这段代码是如何导致内存泄漏的。

var theThing = null;
var replaceThing = function () {
    var originalThing = theThing;
    var unused = function () {
        if (originalThing)
            console.log("hi");
    };
    theThing = {
        longStr: new Array(1000000).join('*'),
        someMethod: function () {
            console.log(someMessage);
        }
    };
};
setInterval(replaceThing, 1000);

如果我在函数originalThing的末尾将replaceThing设置为null,一切都会好起来的。但是我在这里没有看到引用循环,也不知道为什么不能释放这些闭包。

v8 GC是否不使用标记清除?如果我将这些代码放入IIFE,则内存泄漏仍然存在。但是根上下文如何到达这些变量和函数?
我使用chrome来测试这些代码。现在,我对GC在Closure上的工作方式感到困惑。

最佳答案

在第一个将originalThing分配为null的调用之后,theThing成为对新对象的引用,第二个及后续调用originalThing分配了对对象的引用,然后theThing再次成为对新对象的引用,但是originalThing将链接到该对象。先前的对象

关于javascript - 为什么这个js函数会导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42502082/

10-12 20:37