반복문과 비동기 함수가 만날 때 클로저 문제가 자주 발생한다. 클로저의 특성을 사용하여 해결할 수 있는 문제다. 아래 코드에서 for문 안에 log(i) 값이 1씩 증가하는 것을 예상하지만, 함수 안의 변수는 "실행"될 때 값이 결정된다.
함수에서 변수를 찾을 때 없으면 스코프체인을 따라 찾게 되고 그래도 없으면 전역에서 찾게된다.
함수 안에서 선언된 변수는 함수안에서만 유효하다.
비동기콜백함수의 변수는 함수가 실행될 때 값이 결정된다.
for(var i = 0; i < 100; i++) {
setTimeout(function() {
console.log(i);//i를 찾는다. 죽었다 깨나도 1번째 줄의 i가 된다.
},i * 1000);
}//100만 나온다.
---------------------------------------------------------------------
//반복문을 쓰지 않았을 때
setTimeout(function() {
console.log(i);//log(1) log(2) log(3) log(4) log(5)라고 예상하지만
}, 0*1000);//0초를 의미한다. 하지만 바로 실행되는 것을 의미하지 않는다.
setTimeout(function() {
console.log(i);
}, 1*1000);//1초 뒤에 실행된다. 그제서야 i를 찾는다. 그 사이 for문은 반복문을 다 돈다.
setTimeout(function() {
console.log(i);
}, 2*1000);
setTimeout(function() {
console.log(i);
}, 3*1000);
setTimeout(function() {
console.log(i);
}, 4*1000);
setTimeout(function() {
console.log(i);
}, 5*1000);
setTimeout(function() {
console.log(i);
}, 99*1000);