몇 초마다 페이지에서 호출되는 JS 함수가 있습니다. AJAX를 업데이트하는 것입니다.JavaScript의 로컬 변수에서 메모리 해제
함수이므로 로컬 변수를 선언합니다. 클로저 나 전역 변수를 여러 가지 이유로 사용하고 싶지 않습니다.
나는 이것을 결코 고려하지 않았지만 메모리를 해제하기 위해 함수의 끝에서 변수를 해제하거나 지울 필요가 있습니까? 아니면 JS가 자동으로이 작업을 수행합니까?
몇 초마다 페이지에서 호출되는 JS 함수가 있습니다. AJAX를 업데이트하는 것입니다.JavaScript의 로컬 변수에서 메모리 해제
함수이므로 로컬 변수를 선언합니다. 클로저 나 전역 변수를 여러 가지 이유로 사용하고 싶지 않습니다.
나는 이것을 결코 고려하지 않았지만 메모리를 해제하기 위해 함수의 끝에서 변수를 해제하거나 지울 필요가 있습니까? 아니면 JS가 자동으로이 작업을 수행합니까?
변수가 범위를 벗어나면 변수가 해제됩니다. 함수 내에서 선언 된 지역 변수가 js 가비지 수집기에 의해 자동으로 해제되므로 걱정할 필요가 없습니다.
자바 스크립트에 자동 가비지 수집 기능이 있습니다. 아무 것도 할당 해제 할 필요가 없습니다.
일반적으로 없습니다. 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에서는 이러한 문제가 많이 줄어들었지만 믿습니다.
고마워요. 그 IE 버그를 따라갈 수 있습니까? 나는 실제로 그렇게 생각하고있다. 나는 각각의 아약스 업데이트로 리셋되는 글로벌 배열을 가지고있다. 각 사이클의 끝에서 js 배열 업데이트가 포함 된 div를 ajax에서 삭제합니다 (변수를 직접 수락하지 않고 js를 div에 게시해야합니다. 복잡합니다). xx = [];를 사용하여 배열을 지 웁니다. 다음 사이클 준비. 30 분 정도 지나면 IE8이 넘어지면 잘 작동합니다. 귀하의 의견과 관련하여 - 배열을 지우는 더 좋은 방법은 무엇입니까? (IE8 충돌이라는 증거는 없지만 ...) – Bob
문제가 IE에만 해당되는 경우 http://msdn.microsoft.com/en-us/library/Bb250448을 읽는 것이 좋습니다. - 기회 그 문제 중 하나입니까? 실제로 IE8 (메모리 부족 메시지 표시가 아니라)이 충돌하는 경우 메모리와 관련이 없을 수 있습니다. 메모리 문제는 본 적이 없지만 잘못 될 수 있습니다. 그것은 여러 가지 문제가 될 수 있지만 아이디어를 얻기 위해서는 더 많은 코드를 살펴볼 필요가 있습니다. – cryo
이것은 사실이 아닙니다. JS 구현 중 하나에서는 참조 카운팅이없고 가비지 수집 만 있습니다. 모든 참조되지 않은 변수는 "일단 범위를 벗어난"이 아니라 다음 수집 후에 해제됩니다. – homm