>웹 프론트엔드 >JS 튜토리얼 >IE JS 프로그래밍_자바스크립트 기술에서 주의해야 할 메모리 릴리스 문제

IE JS 프로그래밍_자바스크립트 기술에서 주의해야 할 메모리 릴리스 문제

WBOY
WBOY원래의
2016-05-16 18:51:09976검색

1. DOM 객체에 추가된 속성은 객체에 대한 참조입니다. 예:
var MyObject = {};
document.getElementById('myDiv').myProp = MyObject;
해결책:
window.onunload 이벤트에 쓰기: document.getElementById(' myDiv' ).myProp = null;


2. DOM 객체와 JS 객체는 서로를 참조합니다. 예:
function Encapsulator(element) {
this.elementReference = element;
element.myProp = this;
}
new Encapsulator(document.getElementById('myDiv'));
해결책:
onunload 이벤트에 쓰기: document.getElementById('myDiv').myProp = null;


3. AttachEvent를 사용하여 이벤트를 DOM 객체에 바인딩합니다. 예:
function doClick() {}
element.attachEvent("onclick", doClick);
해결책:
onunload 이벤트에 쓰기: element.detachEvent('onclick', doClick );


4.appendChild를 외부에서 내부로 실행합니다. 이때, RemoveChild를 호출하여도 해제할 수 없습니다. 예:
var parentDiv = document.createElement("div");
var childDiv = document.createElement("div");
document.body.appendChild(parentDiv);
parentDiv.appendChild (childDiv);
해결책:
appendChild를 내부에서 외부로 실행:
var parentDiv = document.createElement("div");
var childDiv = document.createElement("div"); 🎜>parentDiv.appendChild(childDiv);
document.body.appendChild(parentDiv);

5. 동일한 속성을 반복적으로 다시 작성하면 많은 양의 메모리를 차지하게 됩니다(단, IE를 종료하면 메모리가 해제됩니다). 예:
for(i = 0; i < 5000; i ) {
hostElement.text = "asdfasdfasdf";
}
이 방법은 5000개의 속성을 정의하는 것과 동일합니다!
해결책:
사실 해결책은 없습니다.P~~~프로그래밍할 때 이런 상황은 피하도록 하세요~~

참고:
1. 위 정보는 Microsoft의 공식 MSDN 사이트에서 가져온 것입니다. 링크 주소:

http://msdn.microsoft.com/librar ... e_leak_patterns .asp위 주소로 이동하시면 예시와 범례를 포함한 자세한 지침을 보실 수 있습니다. 제가 영어를 잘 못해서 잘 못 알아듣는 것 뿐인데, 틀린 부분이나 추가할 점이 있으면 지적해 주세요.

2. 첫 번째 항목에는 실제로 element.onclick = funcRef 작성 방법도 포함됩니다. 이는 개체에 대한 참조이기도 하기 때문입니다. 페이지가 언로드되면 해제되어야 합니다.

3. 세 번째 항목에 대해서는 MSDN 영문 설명을 보면, detachEvent가 호출되더라도, AttachEvent 시 메모리 "LEAK"가 발생했기 때문에 메모리를 해제할 수 없다고 되어 있는 것 같은데, 이후에는 상황이 좋아질 것입니다. detachEvent. 이런 경우인지는 모르겠지만, 영어 잘하시는 분이 지적해 주셨으면 좋겠습니다.

4. 실제 프로그래밍에서는 이러한 메모리 문제의 실제 영향은 크지 않습니다. 특히 고객이 이를 사용하는 경우에는 이를 전혀 눈치 채지 못할 것입니다. 그러나 이러한 문제는 항상 프로그래머에게 걱정거리입니다. 너 그런 버그가 있구나, 그렇지? 해결될 수 있다면 해결하는 것이 최선입니다. 실제로 webfx.eae.net과 같은 상위 JS 소스 코드 사이트에서는 소스 코드의 메모리 릴리스 관리에 사용되는 위의 솔루션을 볼 수 있습니다.

jsvm을 공부하다가 js.lang.System이 gc() 메소드를 정의한다는 것을 발견했습니다

System.gc = function ()

{
if (System.isIeBrowser())
{
CollectGarbage();
setTimeout("CollectGarbage();", 1) ;
 }
}

CollectGarbage()는 IE 고유의 메모리 해제 기능입니다

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