为什么这个js函数会导致内存泄漏?

时间:2017-02-28 06:54:15

标签: javascript memory-leaks garbage-collection

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

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上工作感到困惑。

2 个答案:

答案 0 :(得分:0)

请参阅https://www.ibm.com/developerworks/web/library/wa-memleak/

  

因为内部函数保存了对外部函数变量的引用,所以范围对象...不会被垃圾回收。

答案 1 :(得分:0)

在第一次调用originalThing被指定为null之后,theThing成为对新对象的引用,第二次和后续调用originalThing指定对象的引用,然后再次theThing成为对新对象的引用,但originalThing将链接到上一个对象