더북(TheBook)

보다시피, 이번에는 마지막에 doSomething이 범위를 벗어나지 않는다. 느슨한 모드에서 자바스크립트 엔진은 이를 다음과 같이 효과적으로 처리한다(물론 varDoSomethingletDoSomething은 모두 단순히 doSomething이다).

function branching(num) {
    var varDoSomething;
    console.log("num = " + num + ", typeof doSomething = " + typeof varDoSomething);
    if (num < 0.5) {
        let letDoSomething = function doSomething() {
            console.log("true");
        };
        console.log("true branch, typeof doSomething = " + typeof letDoSomething);
        varDoSomething = letDoSomething; // 선언이 있던 곳
        console.log("end of true block");
    } else {
        let letDoSomething = function doSomething() {
            console.log("false");
        };
        console.log("false branch, typeof doSomething = " + typeof letDoSomething);
        varDoSomething = letDoSomething; // 선언이 있던 곳
        console.log("end of false block");
    }
    varDoSomething();
}
branching(Math.random());

함수는 함수 범위 var 변수에 할당되므로 블록 외부에서 접근할 수 있다. 그러나 선언은 여전히 블록 내에 들어 있다.

다시 말하지만 이러한 레거시 의미 체계에 의존하는 새 코드를 작성하지 않는 것이 가장 좋다. 대신 엄격 모드를 일관되게 유지해야 한다.

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