Javascript 一个全球性的;“窗口”;引用会影响生活中的垃圾收集吗? 函数BigObject(){ var a=“”; 对于(var i=0;i

Javascript 一个全球性的;“窗口”;引用会影响生活中的垃圾收集吗? 函数BigObject(){ var a=“”; 对于(var i=0;i,javascript,garbage-collection,iife,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 act

您正在反向考虑垃圾收集。广义上讲,当您无法从根跟踪到它们时,它们被标记为垃圾。对全局对象进行局部引用并不意味着全局对象对您有引用,因此它不会影响任何东西的生存期。

如果您以另一种方式执行此操作:

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);
现在你遇到了垃圾障碍。 窗口有一个对obj的引用。obj有一个对obj1的引用,还有一个函数有一个对名称的引用


…因此,在程序的
窗口中完全没有引用之前,这两个闭包中的任何东西都不能被垃圾回收。问题

您能解释一下为什么您认为
1.
可能会导致问题吗?
(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));