DOM에 의해 할당 된 메모리를 처리하기 위해 IE의 내장에 사용되는 가비지 수집기는 JScript 엔진에서 할당 한 메모리를 해제하는 방법을 모르고 있습니다. 따라서, 그것은 단지 그런 것들을 무시합니다.
DOM 요소 (또는 그와 비슷한 것)에 이벤트 처리기를 바인딩하고 이벤트 처리기는 다른 함수 호출 내에서 만들어진 함수이고 다른 함수는 10 억 개가 포함 된 로컬 배열을가집니다. DOM 엘리먼트 자체가 쓰레기로 처리 된 이후에도 수십억 가지의 것들이 계속 오랫동안 생겨났다. 그리고 심지어 그것이 포함되어있는 페이지이 오랫동안 사라진 후에도 (나는 생각한다;
function bindHandler(domElement) {
var hoHumWhatever = generateGiganticObjectNow();
domElement.onclick = function() {
alert("oww you clicked me");
};
}
이제 "hoHumWhatever"변수가 클로저에 유지됩니다. 페이지가 다시로드되거나 요소가 버려지도록 DOM을 수정하면 DOM 가비지 수집기가 JScript 소유 메모리를 가리키는 특성을 사용하여 작업을 수행하지 못합니다. 반면 JScript는 DOM 노드가 해제되었음을 알지 못하므로 closure 메모리가 여전히 참조된다고 생각합니다.
일부 내용은 정확하지 않을 수 있음을 인정하지만 이는 기본 문제입니다. 다양한 사람들이 Crockford 씨와 quirksmode에서 (필자는) ppk를 포함하여 이것에 대해 썼다. 더 신중하게 당신이 게시 코드를 다시 읽기시
편집 — , 나는 이 유사하지만 반대의 경우의 예가 될 수 있다고 생각 : 작은 함수는 DOM 값의 일부에 대한 참조를 반환하므로 어쩌면 JScript가 DOM 메모리에 매달려 있다고 말하는 것일 수도 있습니다 (반대의 경우도 마찬가지입니다). 자,이 특별한 경우에 나는 조금 의심 스럽습니다. 왜냐하면 저는 DOM 속성에 대한 간단한 참조를 제외하고 그 closure에서 "탈출"하는 것을 보지 못했기 때문에 원시적 인 문자열 인스턴스 여야하고 그래서 정말로 ' 문제를 일으킬 수 있습니다. 이 문제는 기만적 일 수 있습니다. 그러나 나는 단지 여기 앉아서 머리를 찰 겁니다.
질문자는 매우 벙어리 또는 매우 영리 중 하나입니다. Dumb은 closure 나 메모리 누수가 없기 때문에 전체가 다음과 같습니다 :'var firstNameValue = document.getElementById ('firtName'). value;'. 클로저와 메모리 누수에 대한 언급은 실제 문제에서 산만 해지기 때문에 매우 똑똑합니다. 코드의 불필요한 복잡성 때문입니다. – RobG
"메모리 누수 문제"는 IE8에서 수정 된 것으로보고되었습니다. 그러나 @RobG가 답변 한 것처럼이 방법으로 이전 브라우저에서 메모리 누수가 발생했을 수도 있습니다. 다음 MSDN 페이지는 IE7 및 이전 버전에서 메모리 누수가 발생할 수있는 일련의 테스트 사례를 나열합니다.이 패턴은 포함되어 있지 않습니다. http://msdn.microsoft.com/en-us/library/dd361842(VS.85).aspx – MrWhite