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

1ガベージコレクションとアイテムがメモリに保持される方法についての私の最小限の理解を考えると、と比較すると、メモリの問題が発生する可能性があるよう2です。この時点では、実際のボトルネックよりも学術的な質問の方が多いです...ボールの助けですか?

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

今、あなたはゴミの障害にぶつかっています。ウィンドウにはobjへの参照があります。Objにはobj1への参照があり、nameへの参照を持つ関数があります...

...したがって、プログラムに。の参照がまったく残っていない限り、これらのクロージャのいずれかの内部にあるものはどれもガベージコレクションできませんwindow.thing

于 2013-03-15T20:47:59.667 に答える