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

鉴于我对垃圾收集以及项目如何保存在内存中的了解最少,12. 在这一点上更多的是一个学术问题,而不是一个实际的瓶颈......球帮助?

4

2 回答 2

3

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

于 2013-03-15T20:30:38.283 回答
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.

于 2013-03-15T20:47:59.667 回答