>  기사  >  웹 프론트엔드  >  IE9 이전 버전에서 JS 메모리 누수를 방지하는 방법

IE9 이전 버전에서 JS 메모리 누수를 방지하는 방법

php中世界最好的语言
php中世界最好的语言원래의
2018-05-15 10:25:421205검색

이번에는 IE9 이전 버전에서 JS 메모리 누수를 방지하는 방법과 IE9 이전 버전에서 JS 메모리 누수를 방지하기 위한 예방 조치에 대해 알려드리겠습니다. 실제 사례를 살펴보겠습니다.

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

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

위 코드는 요소 요소이벤트 핸들러프로그램으로 클로저를 생성하고 이 클로저는 순환 참조를 생성합니다. 익명 함수는 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 개체에 대한 참조가 해제될 수 있고, 참조 수는 원활하게 줄어들 수 있으며, 해당 개체가 차지하는 메모리는 적절하게 재활용될 수 있습니다."

나는 당신이 이 기사의 사례를 읽은 후 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트에 주목하세요.

추천 도서:

layui에서 동적 및 정적 페이징을 구현하는 단계에 대한 자세한 설명

vue+jquery+lodash 슬라이딩 시 상단 부동 고정 기능 구현에 대한 자세한 설명

위 내용은 IE9 이전 버전에서 JS 메모리 누수를 방지하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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