Closure(클로저)는 두 개의 함수로 만들어진 환경으로 이루어진 특별한 객체의 한 종류이다.
여기서 환경은, 클로저가 생성될 때 그 범위에 있던 여러 지역 변수들이 포함된 context
를 의미한다.
클로저를 통해서 자바스크립트에는 없는 비공개(
private
) 속성/메소드, 공개(public
) 속성/메소드를 구현할 수 있는 방안을 마련할 수 있다.
다음은 Closure(클로저)가 생성되는 조건이다.
execution environment
)에서 실행된다.x
는 외부 함수의 변수 스코프에 있다.function outer() {
var name = `closure`;
function inner() {
console.log(name);
}
inner();
}
outer(); // closure
outer
함수를 실행시키는 context
에는 name
이라는 변수가 존재하지 않는다.
코드를 약간 변경해보자.
var name = `Warning`;
function outer() {
var name = `closure`;
return function inner() {
console.log(name);
};
}
var callFunc = outer();
callFunc(); // closure
위 코드에서 callFunc
을 Closure(클로저)라고 한다.
callFunc
호출에 의해 name
이라는 값이 콘솔에 찍히는데, 찍히는 값은 Warning
이 아니라 closure
라는 값이다.
즉, outer
함수의 context
에 속해있는 변수를 참조하는 것이다.
여기서 outer
함수의 지역변수로 존재하는 name
변수를 free variable(자유변수)
라고 한다.
잠깐!!!
스코프(
=scope=context
)는 함수를 호출할 때가 아니라 함수를 어디에 선언하였는지에 따라 결정된다. 이를 렉시컬 스코핑(Lexical scoping
)라 한다.
위 예제의 함수inner
는 함수outer
의 내부에서 선언되었기 때문에 함수inner
의 상위 스코프는 함수outer
이다.
함수inner
가 전역에 선언되었다면 함수inner
의 상위 스코프는 전역 스코프가 된다.이처럼 외부 함수 호출이 종료되더라도 외부 함수의 지역 변수 및 변수 스코프 객체의 체인 관계를 유지할 수 있는 구조를 Closure(클로저)라고 한다.
보다 정확히는 외부 함수에 의해 반환되는 내부 함수를 가리키는 말이다.
클로저 함수는 외부 함수의 실행이 끝나더라도 외부 함수 내 변수를 사용할 수 있다.
이처럼 클로저는 특정 데이터를 스코프 안에 가두어 둔 채로 계속 사용할 수 있게하는 폐쇄성을 갖는다.
'클로저 모듈 패턴'을 사용해 객체에 담아 여러 개의 함수를 반환하도록 만든다.
이러한 정보의 접근을 제한하는 것을 캡슐화라고 한다.
클로저 함수를 각각의 변수에 할당하면 각자 독립적으로 값을 사용하고 보존할 수 있다.
이처럼 함수의 재사용성을 극대화하여 하나의 함수를 독립적인 부품의 형태로 분리하는 것을 모듈화라고 한다.
클로저를 통해 데이터와 메소드를 묶어다닐 수 있기에 클로저는 모듈화에 유리하다.