클로저(Closure)는 자바스크립트에서 중요한 개념 중 하나이다. 클로저는 함수가 선언될 때의 렉시컬 환경(Lexical Environment)에 대한 참조를 유지하여, 함수가 자신이 선언될 때의 범위 밖에서 호출되더라도 해당 범위에 접근할 수 있게 하는 기능이. 이를 통해 데이터 은닉과 모듈화 등을 가능하게 한다.
자바스크립트에서 함수는 일급 객체(First-class citizen)이다. 이는 함수를 변수에 할당하거나 다른 함수의 인자로 전달할 수 있음을 의미한다. 클로저는 이러한 함수의 성질을 활용하여 내부 함수가 외부 함수의 변수에 접근할 수 있게 해준다.
function 외부함수(외부변수) {
function 내부함수() {
console.log(외부변수); // 외부 함수의 변수에 접근
}
return 내부함수;
}
const 예제클로저 = 외부함수('클로저 예제');
예제클로저(); // "클로저 예제" 출력
이 코드에서 외부함수는 문자열을 인자로 받고, 내부함수를 반환한다. 내부함수는 외부함수의 변수 외부변수에 접근하여 출력한다. 이때 예제클로저는 외부함수가 반환한 내부함수에 대한 참조를 가지고 있으며, 이를 호출할 때 외부변수의 값에 접근할 수 있다. 이것이 클로저의 기본 원리이다.
위 코드에서 중요한 것은 외부함수가 내부함수를 반환하고, 이 내부함수가 외부함수의 지역변수 외부변수에 접근할 수 있다는 점이다.
함수 정의와 반환
외부함수는 매개변수로 외부변수를 받고, 내부에 내부함수를 정의한 다음 이 내부함수를 반환한다.
클로저의 생성
const 예제클로저 = 외부함수('클로저 예제');
이 코드는 외부함수를 호출하고, 그 결과로 내부함수를 예제클로저에 저장한다. 이때 내부함수는 외부함수의 실행 컨텍스트에 대한 참조를 유지한다. 즉, 외부변수에 대한 접근 권한을 가진다.
클로저의 사용
예제클로저()를 호출하면, 이는 내부함수를 실행하는 것과 같다. 내부함수는 외부변수에 접근하여 "클로저 예제"를 콘솔에 출력한다. 이는 외부함수의 실행이 끝났음에도 내부함수가 외부변수에 접근할 수 있음을 보여준다.
이 예시에서 핵심은 내부함수가 선언된 환경을 '기억'하고, 해당 환경에 있는 변수에 접근할 수 있다는 것이다. 이렇게 함수가 자신이 생성될 때의 변수들을 '기억'하는 것이 바로 클로저의 특징이다.