Closure 란 폐쇄된 공간(함수 안 같은)의 값에 접근하기 위한 일종의 테크닉이다.
이를 이해하기에 앞서 먼저 내부함수와 외부함수에 대해 이야기해보겠다.
function outer() {
let name = 'closure';
function inner() {
alert(name);
}
return inner;
}
위의 코드를 보면 outer함수 안에 inner함수가 있는것을 볼 수 있는데 이때 outer함수를 외부함수, inner함수를 내부함수라고 한다.
함수는 내부함수가 외부함수를 참조할순있어도 외부함수가 내부함수를 참조할 순 없다.
즉 inner함수안에 let name2 = 'closure2'를 선언해 준다 하더라도 그것은 inner함수 안에서만 사용할 수 있지 outer함수에서는 사용할 수 없다.
위의 함수 중 inner함수에 일반적으로는 접근할 수 없다. inner함수는 outer함수 내부에서 선언된 내부함수이기때문에 내가 쓰고싶다고 해도 쓸수있는 함수가 아니다. 이럴때 closure환경을 만들어 주는것이다.
function addOuter(x){
let y = 1;
return function addInner(z){
y = 100;
return x+y+z;
};
}
let a = addOuter(5);
a(10);
// 출처 - MDN Closure
위의 코드를 보면 외부함수addOuter에 내부함수 addInner를 리턴하였고 a에 할당하였다. 그로인해 a안에는 인자 5의 값을 받은 addOuter가 할당되었는데 a에 10의 인자를 주어 a(10)할 경우 addOuter의 매개변수 x가 값을 할당받는게 아니라 addInner의 매개변수 z가 할당받는다. 이때 a는 closure환경이라고 할 수 있다.