3.6.2 블록의 함수 선언: 레거시 웹 의미 체계
웹 브라우저의 느슨한 모드에서는 사양의 부속서 B에 정의된 레거시 웹 의미 체계가 적용된다(일부 엔진은 이를 웹 브라우저 외부에서도 적용한다). 사양은 블록의 함수 선언을 구문 오류로 처리하지 않을 때 엔진이 이를 처리하는 다른 방식이 해당 자바스크립트 엔진의 교차점에 의해 신뢰할 수 있는 동일한 방식으로 처리된 시나리오만 의미한다는 것을 명시한다. 이 세 가지 시나리오는 다음과 같다.
1. 함수는 단일 블록 내에서만 선언되고 참조된다.
2. 함수는 단일 블록 내에서 선언되고 사용 가능하지만 동일한 블록 내에 포함되지 않은 내부 함수 정의에 의해 참조된다.
3. 함수는 단일 블록 내에서 선언되고 사용 가능하지만 후속 블록 내에서도 참조된다.
이 장에서 사용한 branching 함수의 예에서는 두 개의 다른 블록에서 동일한 이름을 사용하는 두 개의 함수 선언이 있고 해당 블록 다음에 나오는 코드에서 해당 이름을 참조하기 때문에 이 세 가지 시나리오 중 어느 것도 맞지 않다. 그러나 이러한 세 가지 시나리오 중 하나와 일치하는 레거시 느슨한 모드 코드가 있는 경우 브라우저 간 작동을 기대할 수 있다. 그렇다고 레거시 웹 의미 체계에 의존하는 새 코드를 작성해야 한다는 의미는 아니다. 대신 표준 시맨틱에만 의존하는 코드를 작성하자(이를 보장하기 위해 엄격 모드 사용하여 작성한다).
레거시 의미 체계는 표준 의미 체계와 거의 동일하지만 블록에서 선언된 함수에 대한 블록 내의 let 변수 외에도 포함하는 함수의 범위(또는 전역 스코프)에 var 변수가 있다. 함수 안에 있지 않다). 블록의 let과 달리 var의 할당은 블록의 맨 위에 올리지 않고 코드에서 함수 선언에 도달할 때 수행된다(이상하게 보이겠지만 표준화 이전에 주요 엔진에 걸친 행동 교차 사례 #2를 지원하기위한 것이다).