자바스크립트 입문_클로저와 메모리 관리
자바스크립트 2021. 5. 9. 13:02(본 포스팅은 위키북스의 '코어자바스크립트' 책을 공부하면서 작성되었습니다_내돈내산)
클로저는 객체지향과 함수형 모두를 아우르는 중요한 개념이다. 메모리 누수의 위험을 이유로 클로저 사용을 조심해야 한다거나 심지어 지양해야 한다고 주장하지만 메모리 소모는 클로저의 본질적인 특성임.
- 메모리 누수: 개발자의 의도와 달리 어떤 값의 참조 카운트가 0이 되지 않아 GC(가비지컬렉터)의 수거 대상이 되지 않는 경우.
- 과거에는 의도치 않게 누수가 발생하는 여러가지 상황들이 있었지만, 그중 대부분은 현재의 자바스크립트 엔진에서는 발생하지 않거나 거의 발견이 힘들어 졌으므로 이제는 의도대로 설계한 '메모리 소모'에 대한 관리법만 잘 파악해서 적용하는 것으로 충분함.
- 관리방법은 매우 간단함. 클로저의 필요성이 사라진 시점에 참조카운트를 0으로 만들어 GC가 수거해갈수 있도록 함. 참조카운트는 식별자에 참조형이 아닌 기본 데이터(보통 null이나 undefined)를 할당하면 됨.
- 클로저의 메모리 관리 -
// (1) return에 의한 클로저의 메모리 해제
let outer = (function() {
let a = 1;
const inner = function () {
return ++a;
};
return inner;
})();
console.log(outer());
console.log(outer());
outer = null; // outer 식별자의 inner함수 참조를 끊어버림
// (2) setInterval에 의한 클로저의 메모리 해제
(function() {
let a = 0;
let intervalID = null;
let inner = function() {
if(++a>=10){
clearInterval(intervalID);
inner = null; // inner 식별자의 함수 참조를 끊음
};
console.log(a);
};
intervalID = setInterval(inner, 100)
})();
'자바스크립트' 카테고리의 다른 글
자바스크립트 입문_접근권한제어(정보은닉) (0) | 2021.05.09 |
---|---|
자바스크립트 입문_콜백함수 내부에서 외부 데이터를 사용하고자 할때 (0) | 2021.05.09 |
자바스크립트 입문_클로저의 의미 및 원리 (0) | 2021.05.08 |
자바스크립트 입문_콜백지옥(callback hell), 비동기(async) 제어 (0) | 2021.05.08 |
자바스크립트 입문_콜백함수(callback function) 내부의 this에 다른 값 바인딩 하기 (0) | 2021.05.08 |