2013-03-15 2 views
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); 

쓰레기 수집의 내 최소한의 이해를 감안할 때 항목이 메모리에 저장하는 방법, 2과 비교했을 때 약간의 메모리 문제가 발생할 수 있습니다 1처럼 보인다. 이 병목 현상보다 학문적 인 질문이 더 많습니다 ... 볼 도움?글로벌 "창"참조가 iife에서 가비지 수집에 미치는 영향은 무엇입니까?

+3

왜 '1.'이 문제를 일으킬 수 있다고 생각하는지 설명 할 수 있습니까? –

답변

3

가비지 수집을 거꾸로 생각하고 있습니다. 일반적으로 루트에서 트레이스까지 추적 할 수없는 경우 사물로 표시됩니다. 전역 개체에 대한 로컬 참조가 있다고해서 전역 개체가 참조를 가지고 있다는 의미는 아니므로 모든 항목의 수명에 영향을주지 않습니다.

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에 대한 참조를 가지고 있으며 ...

...이 폐쇄 중 하나의 내부는 프로그램에서 전혀 참조가 남지 않을 때까지 가비지 수집 가능하지 않습니다. window.thing입니다.