보다시피, 이번에는 마지막에 doSomething이 범위를 벗어나지 않는다. 느슨한 모드에서 자바스크립트 엔진은 이를 다음과 같이 효과적으로 처리한다(물론 varDoSomething과 letDoSomething은 모두 단순히 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 변수에 할당되므로 블록 외부에서 접근할 수 있다. 그러나 선언은 여전히 블록 내에 들어 있다.
다시 말하지만 이러한 레거시 의미 체계에 의존하는 새 코드를 작성하지 않는 것이 가장 좋다. 대신 엄격 모드를 일관되게 유지해야 한다.