2012-05-24 3 views
2

JavaScript의 순환 참조 개념과 메모리 누수 방지에 대한 중요성을 이해하고 있지만 클로저 또는 프로토 타입의 멤버 인 함수 할당 방법에 대한 정보를 찾을 수 없었습니다. 이벤트 핸들러는 가비지 콜렉션에 영향을줍니다. 이제 나도 쓴 가정 해 봅시다 예를 들어이벤트 처리기 할당 및 메모리 누수

는 다음 중 하나를

var o = {}; 
o.var = 10000000; 
o.func = function() { /*Do something that does not involve o.var*/ }; 

function p() { } 
p.prototype.var = 100000; 
p.prototype.func = function() { /*Do something that does not involve p.var*/ }; 

... 그리고 다음 중 하나를 수행 진행 :

var div = document.getElementByID('div'); 
div.onclick = o.func; 

var instance_of_p = new p(); 
var div = document.getElementByID('div'); 
div.onclick = instance_of_p.func; 

겠습니까 FUNC의 할당() DOM 이벤트 핸들러에서 GC가 전체 객체를 수집하지 못하게합니까?

+0

엔진에 따라 다를 수 있습니다. 'func'은'o'를 통해 닫히기 때문에 접근 할 수 있습니다. 일부 엔진은 'o'에 액세스하지 않는다는 것을 인식 할 수 있습니다. –

+0

내가 아는 한 이전 버전의 IE에서 일어난다는 것을 알고있다 ... 그리고 당신은 동일한 HTML 요소 (?)를 참조하는 JS 객체를 참조하는 html 요소를 참조해야한다. 마지막 한개에 관하여 확실하지 않은 M ... =) – benqus

+0

실제로, 나는 그것을 목적에 따라했다. 짧은 예제에서 어리석게 보일 수도 있지만, 동일한 엘리먼트를 여러 번 참조하고있는 긴 코드에서, 읽기 쉽고 효율적으로하기 위해 변수에 할당 할 것입니다. 이 전략은 완료 될 때 변수를 수집하는 GC를 기반으로합니다. 이는 DOM에 할당하고 다른 객체에 의해 참조되지 않는 경우에만 사용되기 때문입니다. 그것이 틀린 진술 인 경우에, 나는 알고 싶을 것이다 ... – MadRabbit

답변

0

예. JavaScript에서 gc가 작동하는 방법에 대해서는 this excellent answer을 읽으십시오. 귀하의 경우 o은 여전히 ​​전체 또는 폐쇄 범위에서 사용할 수 있으므로 수집되지 않습니다. 이 기능은 아직 사용하지 못할 수도 있습니다.

현재 : no problem with circular references입니다.