반복문과 비동기 함수가 만날 때 클로저 문제가 자주 발생한다. 클로저의 특성을 사용하여 해결할 수 있는 문제다. 아래 코드에서 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);