Domanda

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

Given my minimal understanding of garbage-collection and how items are held in memory, it seems like 1 might cause some memory issues when compared with 2. More of an academic question at this point than an actual bottleneck... Ball help?

È stato utile?

Soluzione

You're thinking of garbage collection backwards. Broadly speaking, things are marked as garbage when you can't trace from a root to them. Having a local reference to the global object does not mean the global object has a reference to you, so it doesn't affect the lifetime of anything.

Altri suggerimenti

If you were to do this the other way:

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

Now you're running into garbage-hindrances. Window has a reference to obj. Obj has a reference to obj1, and has a function with a reference to name...

...so none of the stuff inside of either of these closure is garbage-collectable, until the program has absolutely no references left of window.thing.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top