MDN에서는 클로저(Closure)를 이렇게 정의하고 있다.
클로저는 주변 상태(어휘적 환경)에 대한 참조와 함께 묶인(포함된) 함수의 조합입니다. 즉, 클로저는 내부 함수에서 외부 함수의 범위에 대한 접근을 제공합니다. JavaScript에서 클로저는 함수 생성 시 함수가 생성될 때마다 생성됩니다.
굉장히 어렵다.
쉽게 생각하면 함수가 외부에 있는 변수들을 기억하는 능력이라고 생각하면 된다.
function outer() {
let count = 0; // 외부 함수의 변수
function inner() {
count++;
console.log(`현재 카운트: ${count}`);
}
return inner;
}
const counter = outer(); // outer() 호출 후 종료됨
counter(); // "현재 카운트: 1"
counter(); // "현재 카운트: 2"
counter(); // "현재 카운트: 3"
outer() 함수는 호출 후 종료되지만 count 변수는 메모리에서 사라지지 않는다.
내부 함수 inner()가 count에 계속 접근하기 때문이다.
이렇게 외부 함수의 변수에 접근할 수 있는 내부 함수가 클로저이다.
function 냉장고() {
let 음식 = '김치';
function 냉장고문열기() {
console.log(`냉장고 안에는 ${음식}가 있다.`);
}
return 냉장고문열기;
}
const 비밀번호아는사람 = 냉장고();
비밀번호아는사람(); // 냉장고 안에는 김치가 있다.
냉장고() 함수가 실행되고 끝났지만(냉장고의 문이 닫혔지만), 그 안에 있던 음식 변수는 사라지지 않고 남아 있다.
비밀번호를 아는 사람(내부 함수 냉장고문열기())은 여전히 음식 변수에 접근할 수 있다.
이것이 바로 클로저이다.