>웹 프론트엔드 >JS 튜토리얼 >IE9 이전 버전의 JavaScript 메모리 누수 문제(자세한 요약)

IE9 이전 버전의 JavaScript 메모리 누수 문제(자세한 요약)

亚连
亚连원래의
2018-05-21 15:15:181553검색

이 문서는 IE9 이전 버전의 JavaScript의 메모리 누수 문제를 요약합니다. 이에 관심이 있는 친구는 이에 대해 배울 수 있습니다.

IE9 이전 버전에서는 JScript 개체와 COM 개체에 대해 서로 다른 가비지 수집 루틴을 사용하므로(COM 개체는 "참조 계산" 수집 전략을 사용함) 이러한 IE 버전에서는 클로저로 인해 몇 가지 특별한 문제가 발생합니다. 특히, HTML 요소가 클로저 범위에 저장되면 해당 요소가 파괴될 수 없음을 의미합니다.
다음 예를 보세요:

function assignHandler() {
  var elem = document.getElementById('elem_id');
  elem.onclick = function(evt) {
    alert(elem.id);
  };
}

위 코드는 elem 요소에 대한 이벤트 핸들러로 클로저를 생성하고 이 클로저는 순환 참조를 생성합니다. 익명 함수는 AssignHandler()의 활성 객체에 대한 참조를 저장하므로 요소 참조 수를 줄이는 것은 불가능합니다. 익명 함수가 존재하는 한 elem의 참조 번호는 최소 1이므로 차지하는 메모리는 결코 재활용되지 않습니다.

위 코드는 약간 수정하면 해결할 수 있습니다.

function assignHandler() {
  var elem = document.getElementById('elem_id');
  var elem_id = elem.id;
  elem.onclick = function(evt) {
    alert(elem_id);
  };
  elem = null;
}

elem.id의 복사본을 변수에 저장하고 클로저에서 해당 변수를 참조하여 순환 참조를 제거합니다. 하지만 이 단계만으로는 메모리 누수 문제를 해결할 수 없습니다.

"클로저는 elem을 포함하는 함수를 포함하는 전체 활성 객체를 참조합니다. 클로저가 elem을 직접 참조하지 않더라도 참조는 여전히 함수를 포함하는 활성 객체에 저장됩니다. 따라서 다음이 필요합니다. elem을 null로 설정하면 DOM 개체에 대한 참조를 해제할 수 있고, 참조 수를 원활하게 줄일 수 있으며, 해당 개체가 차지하는 메모리를 적절하게 재활용할 수 있습니다."

위 내용은 제가 모두를 위해 편집한 것입니다. . 앞으로도 도움이 되길 바랍니다.

관련 기사:

JavaScript hasOwnProperty() 함수(그림 및 텍스트 자습서, 코드 예제 포함)

Javascript의 for in 루프는 hasOwnProperty와 함께 사용됩니다.

JavaScript 사용의 차이점 isPrototypeOf 및 hasOwnProperty(실용)

위 내용은 IE9 이전 버전의 JavaScript 메모리 누수 문제(자세한 요약)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.