클로저는 외부 변수를 기억하고 외부변수에 접근하는 함수를 말한다. 함수에 함수를 리턴하여 반환하게 되면 함수에 있는 변수는 반환되는 값에 영향을 주고 마치 함수밖에서도 반환된 함수한에서 전역변수인것처럼 보이게된다.
function f1(){
let a=1;
return function f2(){
return a;
}
}
let f=f1();
let A=f();
console.log(A);
f1()안에 f2()함수를 반환하는 함수이다. 반환된 function f2가 f에 저장되며
let f=function f2(){,,,}의 형태를 가지게 된다. 또 A는 f에서 리턴된 a=1을 저장하게 된다. A함수만 놓고봤을 때 변수a는 존재하지 않지만 f1에서 선언된 지역변수 a=1의 영향을 받아 1을 반환한다.
이처럼 함수안에 함수를 리턴받게되면 지역변수 a는 console.log(A)까지 영향을 주게되고 함수안에 함수가 리턴되어 위에 함수의 자원을 쓰는 함수를 클로저라고 부른다.
let i;
for ( i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 100);
}
// '10'이 10번 출력된다
0.1초 동안 반복문이 모두 돌면서 10이 출력된다.
const outer = function () {
let a = 1;
let inner = function () {
return ++a;
}
return inner;
};
let outer2 = outer();
console.log(outer2()); //2
console.log(outer2()); //3