클로저(Closure)는 자바스크립트에서 매우 중요한 개념으로, 함수와 그 함수가 선언된 렉시컬 환경(Lexical Environment)을 함께 기억하는 기능을 말한다. 클로저는 함수가 자신이 정의된 스코프 외부에서 호출될 때에도, 자신이 선언될 당시의 렉시컬 환경을 "기억"하고, 해당 환경에 접글할 수 있는 매커니즘을 제공한다.
클로저는 함수가 생성될 때, 함수와 함께 생성된 렉시컬 환경을 함께 캡처하고, 그 함수의 내부에서 접근 가능한 모든 변수, 함수 등을 포함한다. 이로 인해 함수가 호출될 때마다 해당 환경에 접근할 수 있다.
클로저가 생성되는 이유는 자바스크립트의 함수가 일급 객체(First-Class Object)이기 때문이다. 자바스크립트에서는 함수가 변수에 할당될 수 있고, 다른 함수의 인자로 전달되거나 반환될 수 있다. 이러한 기능을 구현하기 위해, 함수가 선언된 렉시컬 환경을 기억할 필요가 생기는데, 이 역할을 하는 것이 클로저이다.
function outerFunction() {
let outerVariable = 'I am outside!';
function innerFunction() {
console.log(outerVariable);
}
return innerFunction;
}
const closureFunction = outerFunction();
closureFunction(); // "I am outside!"
outerVariable이라는 변수를 선언하고, innerFunction을 정의한 뒤 반환한다.outerVariable에 접근하여 그 값을 출력하는 함수이다.outerFunction을 호출하면 innerFunction이 반환되고, 이를 closureFunction 변수에 할당한다.closureFunction()을 호출하면, outerFunction의 실행 컨텍스트는 이미 종료되었음에도 불구하고, innerFunction이 outerVariable에 접근할 수 있다. 이는 innerFunction이 생성될 때의 렉시컬 환경(스코프)을 클로저로 기억하고 있기 때문이다.function createCounter() {
let count = 0;
return {
increment: function() {
count++;
return count;
},
decrement: function() {
count--;
return count;
}
};
}
const counter = createCounter();
console.log(counter.increment()); // 1
console.log(counter.decrement()); // 0