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를 본다.

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