객체에 대한 활성 참조가 없을 때만 메모리를 회수할 수 있다는 점을 기억하세요. 이는 클로저 및 이벤트 핸들러에서 흔히 발생하는 함정입니다. 일부 JS 엔진은 내부 함수에서 실제로 참조되는 변수를 확인하지 않고 둘러싸는 함수의 모든 지역 변수를 유지하기 때문입니다.
다음은 간단한 예입니다.
으아악
순진한 JS 구현은 이벤트 핸들러가 존재하는 동안 수집할 수 없습니다. bigString。有几种解决这个问题的方法,例如在init()的末尾设置bigString = null(delete对于局部变量和函数参数不起作用: delete从对象中删除属性,而变量对象是不可访问的 - 在严格模式下的ES5甚至会抛出ReferenceError 지역 변수를 삭제하려고 하면! ).
Eric Lippert는 얼마 전에 이 주제에 관해 이야기하는 자세한 블로그 게시물을 작성했습니다(또한 VBScript와 비교). 더 정확하게 말하자면, 그는 JavaScript와 매우 유사하지만 Microsoft가 ECMAScript를 직접 구현한 JScript에 대해 썼습니다. Internet Explorer의 JavaScript 엔진에서도 대부분의 동작이 동일하다고 가정할 수 있습니다. 물론 구체적인 구현 방식은 브라우저마다 다르지만 몇 가지 공통 원칙을 다른 브라우저에도 적용할 수 있을 것으로 생각됩니다.
이 페이지에서 인용:
가비지 수집의 주요 목적은 프로그래머가 자신이 만들고 사용하는 개체의 메모리 관리에 대해 걱정할 필요가 없도록 하는 것입니다. 물론 때로는 불가피한 경우도 있습니다. 가비지 수집이 작동하는 방식에 대해 최소한 일반적인 이해를 갖는 것이 항상 유익합니다.
DOM 객체의 경우 순환 참조에 주의하세요.
JavaScript의 메모리 누수 패턴
객체에 대한 활성 참조가 없을 때만 메모리를 회수할 수 있다는 점을 기억하세요. 이는 클로저 및 이벤트 핸들러에서 흔히 발생하는 함정입니다. 일부 JS 엔진은 내부 함수에서 실제로 참조되는 변수를 확인하지 않고 둘러싸는 함수의 모든 지역 변수를 유지하기 때문입니다.
다음은 간단한 예입니다.
으아악순진한 JS 구현은 이벤트 핸들러가 존재하는 동안 수집할 수 없습니다.
bigString
。有几种解决这个问题的方法,例如在init()
的末尾设置bigString = null
(delete
对于局部变量和函数参数不起作用:delete
从对象中删除属性,而变量对象是不可访问的 - 在严格模式下的ES5甚至会抛出ReferenceError
지역 변수를 삭제하려고 하면! ).메모리 소비에 관심이 있다면 불필요한 클로저를 피하는 것이 좋습니다.
Eric Lippert는 얼마 전에 이 주제에 관해 이야기하는 자세한 블로그 게시물을 작성했습니다(또한 VBScript와 비교). 더 정확하게 말하자면, 그는 JavaScript와 매우 유사하지만 Microsoft가 ECMAScript를 직접 구현한 JScript에 대해 썼습니다. Internet Explorer의 JavaScript 엔진에서도 대부분의 동작이 동일하다고 가정할 수 있습니다. 물론 구체적인 구현 방식은 브라우저마다 다르지만 몇 가지 공통 원칙을 다른 브라우저에도 적용할 수 있을 것으로 생각됩니다.
이 페이지에서 인용:
가비지 수집의 주요 목적은 프로그래머가 자신이 만들고 사용하는 개체의 메모리 관리에 대해 걱정할 필요가 없도록 하는 것입니다. 물론 때로는 불가피한 경우도 있습니다. 가비지 수집이 작동하는 방식에 대해 최소한 일반적인 이해를 갖는 것이 항상 유익합니다.
역사적 참고: 이전 버전의 답변에는
delete
연산자에 대한 잘못된 참조가 있었습니다. JavaScript에서는삭제
작업 연산자는 객체에서 속성을 삭제하는데, 이는 C/C++의delete
와 완전히 다릅니다.delete
运算符的错误引用。在JavaScript中,delete
运算符从对象中删除属性,与C/C++中的delete