2011-09-15 8 views
3

JavaScript '클래스'및 상속에 John Resig's recipe을 사용하고 있습니다. 이 질문에 대한이 같은 다시 내 코드를 제거했습니다개체 내에서 JavaScript 개체를 명시 적으로 해제하려면 어떻게해야합니까?

MyClass = Class.extend({ 

    // create an <h3>Hello world!</h3> in the HTML document 
    init : function (divId) { 
     this._divId = divId; 
     this._textDiv = document.createElement("h3"); 
     this._textDiv.innerHTML = "Hello world!"; 
     document.getElementById(divId).appendChild(this._textDiv); 
    }, 

    // remove the <h3> and delete this object 
    remove : function() { 
     var container = document.getElementById(this._divId); 
     container.parentNode.removeChild(container); 

     // can I put some code here to release this object? 
    } 

}); 

모두 잘 작동 :

var widget = new MyClass("theDivId"); 
... 
widget.remove(); 

내가 페이지에서 이러한 것들을 수백을 가지고 갈거야 (분명히 일부 합리적인 기능) 및 각 개체에 대한 메모리를 해제하는 간단한 방법을 싶습니다. 내가 widget = null;을 사용할 수 있고 GC가 필요한 경우 (?) 개체를 놓을 수 있다고 믿지만 remove() 메서드에서 명시 적으로 할 수 있습니까? 내가 remove()의 끝에서 this = null;을 배치하는 것은 작동하지 않는 것을 알고)

답변

1

번호가 있습니다. 가비지 수집기에 직접 액세스 할 수있는 방법은 없습니다. 말했듯이, 최선의 방법은 객체가 더 이상 참조되지 않도록하는 것입니다.

IMO, 그렇게하는 것이 좋습니다. 가비지 컬렉터는 수년간의 연구가 글쓰기에 들어갔 기 때문에 당신과 나보다 훨씬 더 똑똑합니다. 심지어 최적화를 시도해 보았을 때보 다 더 나은 작업을 수행하지 못했을 가능성이 큽니다.

물론 JS 엔진과 인터페이스 할 경우 실행을 제어 할 수 있고 가비지 수집을 강제 할 수 있습니다 (훨씬 더 많은 것). 물론 내가 그 위치에 있다는 것은 의심의 여지가 있습니다. 관심이 있다면, 거미 원숭이 (또는 v8, 또는 당신의 공상 과학을 간질 이는 무엇이든)를 다운로드하고 컴파일하십시오. repl에서 나는 그 둘 모두에 대해 gc()을 생각합니다.

표준에서 내부적으로 가비지 수집을 정의하지 않았기 때문에 코드의 특정 지점에서 gc를 호출하는 것이 도움이된다고 판단하더라도 그 점을 이해할 수 있습니다. 모든 플랫폼에서 동일한 이점을 제공합니다.

2

수동으로 객체를 파괴 할 방법이 없다, 유일한 방법은 코드에서 실제로 를 GC하는 개체와 신뢰 제거에 대한 모든 링크를 무료로 당신 제거 메소드에서도 및 container = null을 지워야합니다. 일부 브라우저에서는 GC에 문제가 될 수 있으므로

+0

JS 객체를 삭제할 필요가없는 경우가 종종 있지만 더 이상 필요하지 않을 때 DOM 참조를 null로 만드는 것이 좋습니다. (IE6에서는 이것이 필수입니다.) – c69

+0

확인. null에 대한 DOM 참조를 설정하는 몇 줄을 추가했습니다. 팁 고마워 :) – wpearse

1

은 어떤 값도 할당 할 수없는 키워드입니다. 범위에서 개체를 제거하는 유일한 방법은 null을 모든 변수에 수동으로 할당하는 것입니다.

그러나이 방법은 항상 작동하지 않습니다. XMLHttpRequest 객체가 메모리에서 해제되기 전에 XMLHttpRequest의 일부 구현에서 onreadystateopen 함수를 재설정해야합니다.

관련 문제