全局“窗口”引用如何影响生活中的垃圾收集?

时间:2013-03-15 19:34:31

标签: javascript garbage-collection iife

function BigObject() {
  var a = '';
  for (var i = 0; i <= 0xFFFF; i++) a += String.fromCharCode(i);
  return new String(a); // Turn this into an actual object
}

// iife 1 / window gets compressed into w
(function (w, $) {
    var x = new BigObject();
    $("#foo").click(function () {
      w._gaq.push("foo");
    });
})(window, window.jQuery);

// iife 2 / window reference left global
(function ($) {
    var x = new BigObject();
    $("#foo").click(function () {
      window._gaq.push("foo");
    });
})(window.jQuery);

鉴于我对垃圾收集的最小理解以及项目在内存中的保存方式,与1相比,2似乎可能会导致一些内存问题。此时更多的学术问题而不是实际的瓶颈......球帮?

2 个答案:

答案 0 :(得分:3)

你正在考虑向后垃圾收集。从广义上讲,当你无法从根到它们时,事物被标记为垃圾。拥有对全局对象的本地引用并不意味着全局对象具有对您的引用,因此它不会影响任何内容的生命周期。

答案 1 :(得分:2)

如果你以另一种方式这样做:

(function (w) {

    var name = "bob",
        obj1 = { a : 1, b : 2 },
        obj = (function () {
            var a = obj1,
                return { items : a, getName : function () { return name; } };
        }());

    w.thing = obj;
}(window));

现在你遇到了垃圾障碍。 Window有对obj的引用。 Obj有一个对obj1的引用,并且有一个带有name ...的引用的函数。

...所以这些闭包中的任何一个都不是垃圾收集的,直到程序完全没有window.thing的参考。