클로저, clousure란?
- 어떤 함수 A에서 선언한 변수 a를 참조하는 A의 내부함수B를 외부로 전달할 경우 A의 실행 컨텍스트가 종료된 이후라도 변수 a가 사라지지 않는 현상.
- 이러한 현상은 자바스크립트의 가비지 컬렉터의 동작원리 때문에 발생하는데, 자바스크립트의 가비지컬렉터는 어떤 값을 참조하는 변수가 하나라도 있다면 그 값은 수집 대상에 포함하지 않는다. V8엔진에서는 실행컨텍스트가 종료될 때 해당 실행컨텍스트의 내부함수가 실제로 사용하는 변수만 남겨두고 나머지는 가비지컬렉팅하도록 최적화 되어있다.
- 클로저는 어떤 필요에 의해 의도적으로 함수의 지역변수가 계속 메모리에 머물도록 함으로써 발생하므로, 그 필요성이 사라지면 더 이상 메모리를 소모하지 않도록 관리를 하여 메모리누수 문제가 발생하지 않도록 해야한다. 그러기 위해서는 해당 변수의 참조카운트를 0으로 만들면 된다. 참조카운트를 0으로 만드는 가장 간단한 방법은 식별자에 기본형데이터인 null이나 undefined를 할당하는 것!
클로저 활용사례
1. 콜백함수 내부에서 외부 데이터 사용
ex) 이벤트리스터에 등록한 콜백함수가 외부 변수를 참조하는 경우, 이벤트리스너가 선언되어있는 컨텍스트가 종료되더라도 콜백함수가 참조하고있는 외부변수는 가비지컬렉팅되지 않고 계속 참조가능 하다
2. 정보은닉
- class연산자 대신, 함수안에서 지연변수 및 내부함수등을 생성하고 외부에 접근 권한을 주고하는 대상들로 구성된 객체를 반환하는 함수를 이용한다.
- 외부에 제공하고자 하는 정보들만 모아서 return하고 내부에서만 사용할 정보들은 return 하지 않는 것으로 외부로부터의 접근권한 제어가 가능해진다.
- 클로저현상으로 인해 함수 내부의 private member들은 계속 메모리에 남아있게 된다.
'Frontend' 카테고리의 다른 글
var, let, const 차이 (0) | 2020.11.08 |
---|---|
JS 프로토타입 (0) | 2020.11.07 |
JS this (0) | 2020.11.07 |
JS 실행 컨텍스트 (0) | 2020.11.07 |
JS 데이터 타입 (0) | 2020.11.07 |