1. 폐쇄는 무엇이며 폐쇄와 관련된 범위 체인은 여기에서 논의되지 않습니다.
2. JavaScript 쓰레기 수집 메커니즘
JavaScript는 수동으로 무료 메모리를 필요로하지 않으며 자동 쓰레기 수집 메커니즘을 사용합니다. 객체가 쓸모 없을 때, 즉 프로그램의 변수가 객체를 지칭하지 않으면 변수가 메모리에서 해제됩니다.
코드 사본은 다음과 같습니다.
var s = [1, 2,3];
var s = null;
// 이런 식으로 원래 배열 [1, 2, 3]이 출시됩니다.
3. 인용 재활용
세 개체 A, B, c
Aàbàc : A의 특정 속성은 B를 참조하고 C는 B의 속성에 의해서도 참조됩니다. A가 지워지면 B와 C도 해제됩니다.
aàbàcàb : b 객체를 참조하기 위해 c의 특정 속성이 여기에 추가됩니다. 이것이 a를 지우려면 B와 C 사이에 원형 기준이 생성되므로 B와 C는 해제되지 않습니다.
코드 사본은 다음과 같습니다.
var a = {};
A.pro = {a : 100};
a.pro.pro = {b : 100};
a = null;
//이 경우 {A : 100} 및 {B : 100}도 동시에 출시됩니다.
var obj = {};
obj.pro = {a : 100};
obj.pro.pro = {b : 200};
var 2 = obj.pro.pro;
obj = null;
//이 경우 {b : 200}은 릴리스되지 않으며 {a : 100}은 해제됩니다.
4. 참조 및 폐쇄를 재활용하십시오
코드 사본은 다음과 같습니다.
함수 외부 () {
var obj = {};
함수 내부 () {
// OBJ 객체가 여기에 참조됩니다
}
obj.inner = 내부;
}
이것은 일종의 숨겨진 원형 기준입니다. 바깥 쪽이 한 번 호출되면 두 개의 객체 obj와 내부가 그 안에 생성됩니다. OBJ의 내부 속성은 내부를 말합니다. OBJ는 여전히 InnerFun의 폐쇄 된 환경에 있기 때문에 비슷한 내부도 OBJ를 나타냅니다. 정확하게 말하면, 이것은 JavaScript의 고유 한 "스코프 체인"때문입니다.
따라서 클로저는 원형 참조를 만들기가 매우 쉽고 운 좋게도 JavaScript는 이러한 원형 참조를 잘 처리 할 수 있습니다.
5. IE의 메모리 누출
IE에는 몇 가지 메모리 누출이 있으며 여기에는 자세한 설명이 있습니다 (http://msdn.microsoft.com/en-us/library/bb250448.aspx).
이 중 하나만이 여기에서 논의됩니다. 즉, 원형 참조로 인한 메모리 누출은 가장 일반적인 상황이기 때문입니다.
DOM 요소 또는 ActiveX 객체와 일반 JavaScript 객체 사이에 루프 참조가있는 경우, 즉, 이러한 변수를 출시하는 데 특별한 어려움이 있습니다. 루프 참조를 수동으로 자르는 것이 가장 좋습니다. 이 버그는 IE 7 (http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html)에 수정되었습니다.
"IE 6은 하나 이상의 DOM 노드가 생성 된 여러 객체 사이의 원형 기준이 생성 될 때 메모리 누출로 어려움을 겪었습니다.이 문제는 IE 7에서 해결되었습니다."
위의 예제 (점 4)에서 OBJ가 JavaScript 함수 객체 (내부)가 아니라 ActiveX 객체 또는 DOM 요소를 참조하면 IE에 형성된 원형 기준을 해제 할 수 없습니다.
코드 사본은 다음과 같습니다.
함수 init () {
var elem = document.getElementById ( 'id');
elem.onclick = function () {
경고 ( 'Rain-Man');
// Elem 요소는 여기에 참조됩니다
};
}
Elem은 클릭 이벤트의 청취 기능을 말하며,이 기능은 범위 체인을 통해 Elem 요소를 참조합니다. 이런 식으로, 현재 페이지를 IE로 남겨 두더라도 이러한 원형 참조는 해제되지 않습니다.
6. 솔루션
기본 방법은이 원형 기준을 수동으로 지우는 것입니다. 다음은 매우 간단한 예입니다. 그것을 사용할 때는 addevent () 기능을 직접 구축하고 창의 언로드 이벤트에서 모든 이벤트 바인딩을 지울 수 있습니다.
코드 사본은 다음과 같습니다.
함수 외부 () {
var one = document.getElementById ( 'one');
one.onclick = function () {};
}
Window.onload = function () {
var one = document.getElementById ( 'one');
하나.onclick = null;
};
기타 방법 (작성자 : Douglas Crockford)
코드 사본은 다음과 같습니다.
/**
* 특정 요소 노드와 모든 후손 요소를 반복
*
* @param elem 노드 요소 노드를 지 웁니다.
* @param function func funct forcting
*
*/
함수 walkthedom (노드, func) {
func (노드);
node = node.firstchild;
while (노드) {
Walkthedom (노드, func);
node = node.nextibling;
}
}
/**
* 메모리 누출을 방지하기 위해 DOM 노드에서 모든 참조를 지우십시오.
*
* @param elem 노드 요소 노드를 지 웁니다.
*
*/
함수 purgeeventhandlers (노드) {
walkthedom (노드, 함수 (e) {
for (var n in e) {
if (typeof e [n] ===
'기능') {
e [n] = null;
}
}
});
위는 JavaScript 메모리 누출의 관련 컨텐츠 및 솔루션입니다. 필요한 친구는 그것을 참조 할 수 있습니다.