반환된 내부함수에 의해서 외부함수의 스코프가 유지되는 환경
반환된 내부함수에 의해서만 외부함수의 스코프에 접근/수정이 가능한 환경
Closure
는 폐쇄
라는 사전적 의미를 갖고있다.
자바스크립트에서는 외부에서 변수에 접근하는 방법을 폐쇄해주는 방법으로도 정의 할 수 있을 것 같다.
이런 특징으로 클로저는 객체지향프로그래밍의 정보은닉라는 개념을 구현하기위한 용도로 사용된다.
클로저를 이해하기위해선 스코프개념을 이해해야한다.
자바스크립트의 스코프에 대해 간단히 정리해보자.
스코프 란?
- 변수가 저장되는 논리적인 공간이자, 변수의 유효범위이다.
- 기본적으로 함수단위로 스코프를 갖는다. (ES6부턴 블록스코프도 사용이 가능하다.)
- 스코프는 함수가 호출되면 생성되고, 끝나면 사라진다.
- 스코프는 중첩이 가능하다.
- 내부스코프는 외부스코프로 접근이 가능하고, 그 역은 불가능하다.
위의 개념들을 이용해서, Closure를 만들어보자.
function outerFn() {
let number = 1;
function innerFn() {
// 내부함수에서 외부스코프의 변수를 사용하지않는다면 클로져가 아니다!
return ++number;
}
return innerFn;
}
const increment = outerFn();
console.log(increment()); // 2
console.log(increment()); // 3
console.log(number); // Uncaught ReferenceError: number is not defined
number변수가 보호되는 Closure가 만들어졌다.
이렇게 특정 변수에 대한 접근이 return 된 내부함수에 의해서만 가능해진 환경을 Closure라고 부른다.