2010-04-21 8 views
26

몇 초마다 페이지에서 호출되는 JS 함수가 있습니다. AJAX를 업데이트하는 것입니다.JavaScript의 로컬 변수에서 메모리 해제

함수이므로 로컬 변수를 선언합니다. 클로저 나 전역 변수를 여러 가지 이유로 사용하고 싶지 않습니다.

나는 이것을 결코 고려하지 않았지만 메모리를 해제하기 위해 함수의 끝에서 변수를 해제하거나 지울 필요가 있습니까? 아니면 JS가 자동으로이 작업을 수행합니까?

답변

0

변수가 범위를 벗어나면 변수가 해제됩니다. 함수 내에서 선언 된 지역 변수가 js 가비지 수집기에 의해 자동으로 해제되므로 걱정할 필요가 없습니다.

+0

이것은 사실이 아닙니다. JS 구현 중 하나에서는 참조 카운팅이없고 가비지 수집 만 있습니다. 모든 참조되지 않은 변수는 "일단 범위를 벗어난"이 아니라 다음 수집 후에 해제됩니다. – homm

4

자바 스크립트에 자동 가비지 수집 기능이 있습니다. 아무 것도 할당 해제 할 필요가 없습니다.

27

일반적으로 없습니다. var으로 선언 된 변수는 로컬 변수이며 돌아 오면 가비지 수집됩니다. var을 생략하면 변수는 전역 변수이며 delete 키워드를 사용하면 일부 경우 전역 변수에 유용 할 수 있지만 일반적으로 var 인 모든 변수를 window 네임 스페이스를 오염시키지 않도록 선언하는 것이 좋습니다. inst 삭제 또는 범위 (쓰레기 수집)에서하게되는 경우

function myclass() { 
    this.variable = 'myvalue' 
    ... 
    delete this.variable // finished with this variable 
} 
var inst = new myclass() 

베어 마음에있는 모든 속성이 삭제됩니다 :하지만 예를 들어, 프로토 타입 기반 상속을 사용하는 경우

delete

유용 할 수 있습니다 게다가. delete는 해시 테이블에서 항목을 삭제하는 데 유용 할 수 있습니다 :

var d = {} 
d['blah'] = 'myvalue' 
... 
delete d['blah'] 

일부 브라우저 별 가비지 컬렉션 버그가 있습니다. IE는 때때로 DOM 요소 및 클로저 등의 속성을 정리하는 데 문제가 있습니다.하지만 IE8에서는 이러한 문제가 많이 줄어들었지만 믿습니다.

+0

고마워요. 그 IE 버그를 따라갈 수 있습니까? 나는 실제로 그렇게 생각하고있다. 나는 각각의 아약스 업데이트로 리셋되는 글로벌 배열을 가지고있다. 각 사이클의 끝에서 js 배열 업데이트가 포함 된 div를 ajax에서 삭제합니다 (변수를 직접 수락하지 않고 js를 div에 게시해야합니다. 복잡합니다). xx = [];를 사용하여 배열을 지 웁니다. 다음 사이클 준비. 30 분 정도 지나면 IE8이 넘어지면 잘 작동합니다. 귀하의 의견과 관련하여 - 배열을 지우는 더 좋은 방법은 무엇입니까? (IE8 충돌이라는 증거는 없지만 ...) – Bob

+0

문제가 IE에만 ​​해당되는 경우 http://msdn.microsoft.com/en-us/library/Bb250448을 읽는 것이 좋습니다. - 기회 그 문제 중 하나입니까? 실제로 IE8 (메모리 부족 메시지 표시가 아니라)이 충돌하는 경우 메모리와 관련이 없을 수 있습니다. 메모리 문제는 본 적이 없지만 잘못 될 수 있습니다. 그것은 여러 가지 문제가 될 수 있지만 아이디어를 얻기 위해서는 더 많은 코드를 살펴볼 필요가 있습니다. – cryo

관련 문제