보다시피, 이번에는 마지막에 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 변수에 할당되므로 블록 외부에서 접근할 수 있다. 그러나 선언은 여전히 블록 내에 들어 있다.
다시 말하지만 이러한 레거시 의미 체계에 의존하는 새 코드를 작성하지 않는 것이 가장 좋다. 대신 엄격 모드를 일관되게 유지해야 한다.