위 사진에서 함수 outter 내부에 있는 함수 inner를 내부함수 라고합니다.
내부함수는 외부함수의 지역변수에 접근할 수 있습니다.
function outter(){
var title = 'closure';
return function(){
alert(title);
}
}
inner = outter(); // 외부함수 return 값을 inner 변수에 담음.
// 즉, 내부함수를 inner 변수에 담음.
inner(); // inner변수에 담긴 함수를 호출 시 alert(title) 구문 실행됨.
outter 함수는 내부함수를 리턴했으므로 소멸되지만 내부함수는 외부함수의 변수에 접근이 가능하다.
즉, 외부함수가 더이상 사용되지 않는 경우에도 내부함수가 외부함수에 접근할 수 있다.
외부함수는 클로저를 생성하는 팩토리 함수다. (객체를 생성하는 공장)
function makeCounter(){
var count = 0;
return function(){ // 내부함수
return count ++;
}
}
var counter = makeCounter();
console.log(counter()); // 0
console.log(counter()); // 1
console.log(counter()); // 2
변수 count는 클러저의 내부 상태로서 저장됨.
클로저의 내부 상태(외부 함수의 지역 변수)는 외부로부터 은폐되어 있으며 중첩 함수안에서만 읽거나 쓸 수 있음.
function makeCounter(){
var count = 0;
return function(){
return count ++;
}
}
var counter1 = makeCounter();
var counter2 = makeCounter();
console.log(counter1()); // 0
console.log(counter2()); // 0
console.log(counter1()); // 1
console.log(counter2()); // 1
makeCounter()를 실행해서 counter1, counter2 두개의 함수를 생성해 보면
모두 별도의 카운터가 됩니다. 그래서 각 클로저는 서로 다른 내부 상태를 저장합니다.