2015-01-17 3 views
2

요소가 DOM에서 제거 된 후 해당 이벤트 리스너가 자동으로 등록 취소되고 참조 된 리소스 (클로저)가 정리됩니까? 그렇다면 일부 비 이벤트 리스너 코드가 요소에 대한 참조를 보유하고 있으면 대답이 변경됩니까?JavaScript 이벤트 리스너가 자동으로 정리 되었습니까?

내 특정 관심사는 unload 이벤트가 발생하고 대부분의 문서가 대체되고 (물론 많은 대체 요소가 이벤트 리스너도 등록하는) "의사 탐색"과 관련되지만 다른 것보다 먼저 여러 개의 의사 탐색이있을 수 있습니다 전체 페이지로드가 발생합니다. 그래서 추가 된 모든 이벤트 리스너를 추적해야하고 unload이 참조하는 리소스가 누출되지 않도록 수동으로 제거해야하는지 궁금합니다.

(참고 :.. 내 경우에는, 내가 IE8 +와 다른 브라우저의 합리적 새로운 버전과의 호환성에 관심이 유효한 해결책이 아니다 "JQuery와/[JS 다른 라이브러리]가 처리하기 위해 사용")

+0

가능한 복제본 [요소가 삭제 된 후 이벤트가 자동으로 바인딩 해제됩니까?] (http://stackoverflow.com/questions/15999416/will-events-automatically-be-unbound-after-the-element-was- destroyed) –

+0

제안 된 복제본은 jQuery에 대해 다소 구체적입니다. 나는 jQuery를 사용할 수 없다. – ecraig12345

답변

3

최신 브라우저에서 가비지 수집 프로세스의 일부로 DOM 요소가 가비지 수집되면 이벤트 핸들러가 제거되고 정리됩니다. 삭제 된 DOM 요소에 대한 참조가있는 Javascript가 있으면 유지되고 가비지 수집되지 않기 때문에 DOM에서 제거 할 때와 다릅니다.

참고 : 이것은 의도 한 기능입니다. 일부 오래된 브라우저의 경우 일부 버그가있을 수 있습니다. IE의 이전 버전은 가비지 수집 문제에 가장 취약합니다. 많은 다른 유형의 GC 문제는 이전 버전의 IE에서 문서화되어 있지만 설명하는 경우 특정 문제는 알지 못합니다.

+0

자세한 내용은 알고 계십니까? 나는 올바른 검색 용어를 생각할 수 없었기 때문에 아무것도 찾을 수 없었습니다. – ecraig12345

+0

@ ecraig12345 - "DOM memory leaks"로 검색하십시오. – jfriend00

+0

이것은 클로저에서 DOM 요소를 참조하는 데주의를 기울여야합니다. (삭제를 할 때 노드를 참조하는 큰 소스 중 하나이므로 (확장자, 이벤트 핸들러) –