클로저는 함수와 그 함수가 선언된 렉시컬 환경의 조합입니다. 내부 함수가 외부 함수의 변수에 접근할 수 있는 것을 의미합니다. 외부 함수의 실행이 끝나더라도 내부 함수가 외부 함수의 변수를 기억하고 접근할 수 있습니다. 이는 JavaScript의 렉시컬 스코핑 규칙에 의해 가능합니다.
01 · Concept
클로저 (Closure)
클로저는 함수와 그 함수가 선언된 렉시컬 환경의 조합입니다. 내부 함수가 외부 함수의 변수를 기억하는 현상입니다.
JavaScript에서 함수는 자신이 생성된 시점의 스코프를 기억합니다. 외부 함수가 종료된 후에도 내부 함수는 외부 함수의 변수에 접근할 수 있습니다. 이것이 클로저입니다. React의 useState, useEffect 등 훅도 내부적으로 클로저를 활용합니다.
02 · Interactive Demo
스코프 체인과 클로저 시각화
각 예제를 선택하고 실행하여 클로저가 어떻게 외부 변수를 기억하는지 확인하세요.
function createCounter() {
let count = 0; // 외부 함수의 지역 변수
return function() { // 클로저: count를 기억
count++;
return count;
};
}
const counter = createCounter();
counter(); // 1
counter(); // 2
counter(); // 3Scope Chain
Global Scope
counter = ƒ (closure)
createCounter Scope
count = 0
Inner Function (Closure)
[[Scope]] = → count
03 · Code Example
코드 예시
실제 코드로 동작 원리를 확인하세요.
function outer() {
const message = 'Hello'; // 외부 함수의 변수
function inner() {
console.log(message); // 클로저: 외부 변수 참조
}
return inner;
}
const fn = outer();
fn(); // 'Hello' — outer()는 이미 종료되었지만
// inner()가 message를 기억하고 있음04 · Interview Point
면접 핵심 질문
1. 데이터 캡슐화/프라이빗 변수 — 모듈 패턴에서 외부 접근을 차단 2. 팩토리 함수 — 설정을 기억하는 함수 생성 (커링, partial application) 3. 이벤트 핸들러 — 콜백에서 외부 상태 참조 4. 메모이제이션 — 이전 계산 결과를 캐싱 5. React의
useState, useEffect 등 훅도 내부적으로 클로저를 활용합니다.클로저가 외부 변수를 참조하고 있으면, 해당 변수는 가비지 컬렉션의 대상이 되지 않습니다. 클로저가 더 이상 필요하지 않은데도 참조를 유지하면 메모리 누수가 발생할 수 있습니다.
예방법: 1. 불필요한 클로저 참조를
예방법: 1. 불필요한 클로저 참조를
null로 해제 2. 이벤트 리스너 등록 시 반드시 해제 처리 3. WeakRef나 WeakMap 활용 검토