
책 정보
이 글의 목적 및 대상 독자
클로저(Closure)란 함수와 그 함수가 선언된 어휘적(렉시컬) 환경을 함께 기억하는 구조를 말합니다.
즉, 함수 바깥에 선언된 변수에 접근할 수 있는 함수 객체를 “클로저”라고 부릅니다.
정의 한 줄 요약
“함수 → 자신이 선언된 환경(scope)을 기억 → 외부 변수에 접근 가능”
[[Environment]]에 저장합니다.함수A 내부 렉시컬 환경
└─ [[Environment]] ─> 전역 렉시컬 환경(Global)
💡 Tip
클로저는 ‘함수가 어디서 실행되었느냐’가 아니라 ‘함수가 어디서 선언되었느냐’에 따라 외부 변수를 참조합니다.
function createCounter() {
let count = 0; // ▶ 클로저가 참조하는 변수
return function() {
return ++count;
};
}
const counter = createCounter();
// counter 함수가 살아있는 한 count 변수는 메모리에 남음
// 해제하려면…
counter = null; // 이제 count는 GC 대상이 됨
function repeat(message, times) {
for (let i = 0; i < times; i++) {
setTimeout(() => {
console.log(`${i + 1}: ${message}`); // ▶ 클로저로 i, message 참조
}, 1000 * i);
}
}
repeat("안녕하세요", 3);
// 1초 후: "1: 안녕하세요"
// 2초 후: "2: 안녕하세요"
// 3초 후: "3: 안녕하세요"
💡 Tip
var 대신 let/const를 쓰면 블록 스코프가 적용되어 의도한 대로 동작합니다.
function createSecret(secretValue) {
return {
getSecret() {
return secretValue; // ▶ 외부에서는 secretValue 접근 불가
}
};
}
const vault = createSecret("TOP_SECRET");
console.log(vault.getSecret()); // "TOP_SECRET"
// console.log(vault.secretValue); // undefined
💡 Tip
모듈 패턴(Module Pattern)에서 자주 사용됩니다.
function add(a, b) {
return a + b;
}
function partial(fn, fixedA) {
return function(b) {
return fn(fixedA, b); // ▶ 클로저로 fixedA 참조
};
}
const addFive = partial(add, 5);
console.log(addFive(10)); // 15
💡 Tip
Lodash의 _.partial 유틸과 개념 동일
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn(...args);
}
return function(...more) {
return curried(...args, ...more);
};
};
}
// 사용 예
function multiply(a, b, c) {
return a * b * c;
}
const curriedMul = curry(multiply);
console.log(curriedMul(2)(3)(4)); // 24
console.log(curriedMul(2, 3)(4)); // 24
💡 Tip
커링은 함수 조합(Function Composition)과 함께 함수형 프로그래밍에서 널리 사용됩니다.
진서님 좋은 글 잘 보고 갑니다~👍