더북(TheBook)

2.7.1 “루프 내 클로저” 문제

아마도 “루프 내 클로저” 문제에 대해 잘 알고 있을 것이다. 코드 2-3의 코드를 실행하여 이 문제를 확인하자.

코드 2-3 루프 내 클로저 문제–closures-in-loops-problem.js

function closuresInLoopsProblem() {
    for (var counter = 1; counter <= 3; ++counter) {
        setTimeout(function() {
            console.log(counter);
        }, 10);
    }
}
closuresInLoopsProblem();

(이 문제를 해결하는 데 도움이 될 수 있는 setTimeout의 기능은 무시하자. 이는 비동기 작업의 자리를 표시하는 예일 뿐이다).

코드가 1, 2, 3을 출력할 것으로 예상했을 텐데 실제로는 4, 4, 4를 출력한다. 그 이유는 루프가 끝날 때까지 각 타이머가 콜백을 실행하지 않기 때문이다. 콜백을 호출할 때까지 counter의 값은 4이고 var로 선언되었기 때문에 counterClosuresInLoopsProblem 함수 전체에서 정의된다. 세 타이머 콜백은 모두 동일한 counter 변수를 통해 감싸지므로 모두 값 4를 본다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.