클로저란 함수와 함수가 선언된 어휘적 환경(lexical environment)의 조합이다. 클로저를 이해하려면 자바스크립트가 어떻게 변수의 유효범위를 지정하는지(Lexical scoping)를 먼저 이해해야 한다.
(출처: MDN)
클로저를 배우기 전에 스코프에 대한 개념은 아래 링크에 정리해 두었다.
참고로 클로저는 JavaScript의 고유한 개념이 아닌, 여러 함수형 프로그래밍 언어에서 공통적으로 발견되는 특성이다. 따라서 다양한 문헌이나 웹사이트에서 조금씩 다른 방식으로 클로저를 정의하기도 한다.
Closure의 사전적 의미는 폐쇄
이다. 클로저의 핵심은 스코프를 이용하여 변수의 접근 범위를 ‘폐쇄’하는 것에 있다.
외부함수의 실행이 종료된 후에도, 클로저 함수는 외부함수의 스코프, 즉, 함수가 선언된 어휘적 환경에 접근할 수 있다.
상위 스코프의 식별자를 포함하여 쓰여있는 내부 함수 코드 자체를 어휘적 환경(lexical environment)라고 부를 수 있다.
전역변수 사용의 최소화
데이터 보존 가능
폐쇄성
을 갖는다.모듈화를 통한 코드 재사용에 편리
모듈화
라고 한다. 클로저를 통해 데이터와 메소드를 묶어다닐 수 있기에 클로저는 모듈화에 유리하다.정보의 접근 제한 (캡슐화)
클로저 모듈 패턴
을 사용해 객체에 담아 여러 개의 함수를 리턴하도록 만들어 정보의 접근을 제한할 수 있는데, 이를 캡슐화
라고 한다.function outer() {
let message = 'Hello! ';
return function inner(name) { // inner함수는 클로저
return message = message + name;
}
}
let greeting = outer(); // 외부함수 호출. 변수 greeting은 inner 함수를 참조
console.log(greeting('Janet')); // Hello! Janet
outer 함수는 종료됐지만, outer 함수 내부 변수인 message는 inner함수를 통해 접근 가능하다. 여기서의 inner함수가 바로 클로저이다.
이는 클로저의 특성으로 inner함수가 선언될 때 그 주변의 lexical environment(어휘적 환경) 즉, outer 함수의 lexical environment와 함께 묶였기 때문이다. 따라서 message라는 변수를 사용할 수 있게 된다.
Reference.
좋은 글 감사합니다. 자주 방문할게요 :)