A closure is the combination of a function and the lexical environment within which that function was declared
"클로저는 어떤 함수와 해당 함수가 선언된 렉시컬 환경의 조합이다."
상위 함수보다 하위 함수가 더 오래 살아 있는 경우를 closure라고 함
function outer() {
let a = 10;
return function inner() {
a++;
console.log(a);
};
}
const fn = outer();
const fn2 = outer();
fn();
fn2();
fn2();
/////////////////////////////
function make(m) {
return function (x) {
return x * m;
};
}
const d = make(2);
const t = make(3);
console.log(d(5));
console.log(t(6));
클로저 사용패턴
캡슐화(은닉화)
함수 팩토리: 특정 기능을 하는 함수를 고정할 때
비동기 프로그램 패턴 : 비동기적으로 코드를 실행할 수 있게 해줌
메모이제이션(데이터 캐싱)
더 이상 참조되지 않는 객체를 메모리에서 자동으로 해제하는 프로세스
메모리 누수 방지 -> 프로그램의 안전성 높임
1.루트 객체를 기준으로 참조 그래프 생성
2.참조 그래프를 탐색하여, 더 이상 참조되지 않는 객체를 찾음
3.더 이상 참조되지 않는 객체를 메모리에서 해제
가비지 컬렉션은 자바스크립 엔진이 자동으로 수행하므로, 개발자는 메모리 관리를 신경 쓸 필요가 없다.
클로저는 함수가 선언된 시점의 변수를 계속해서 참조하기 때문에, 가비지 컬렉션이 클로저를 해제하지 못하고 메모리 누수
따라서 클로저를 사용할 때는 불필요한 참조를 제거하는 것이 중요
예를 들어, 클로저 내부에서 더 이상 사용되지 않는 변수를 null로 설정하여, 가비지 컬렉션이 이를 해제할 수 있도록 해야 한다.
이를 통해 메모리 누수를 방지하고, 프로그램의 성능을 최적화할 수 있다.