그렇게 설계되었을 수도 있다. 그렇다. 하지만 얼마나 혼란스러울까? 범위의 초기에는 식별자를 사용하지만 범위의 후반에는 버그를 요구하는 것이다.
대신, let과 const는 임시 데드존(Temporal Dead Zone, TMZ)이라는 개념을 사용한다. 코드 실행 내에서 식별자를 전혀 사용할 수 없는 기간인 TDZ는 포함된 범위의 엔트리를 참조하는 데도 사용되지 않는다. var와 마찬가지로 자바스크립트 엔진은 코드의 단계별 실행을 시작하기 전에 let과 const 선언에 대한 코드를 살펴보고 처리한다. 그러나 answer에 접근할 수 있도록 하고 정의되지 않은 값을 제공하는 대신 엔진은 answer를 “아직 초기화되지 않음”으로 표시한다.
let answer; // 외부 'answer' function notInitializedYet() { // 여기에 'answer'를 예약해 둔다. answer = 42; // ReferenceError: 'answer' is not defined console.log(answer); let answer; // 내부 'answer' } notInitializedYet();
TDZ는 코드 실행이 선언이 나타나는 범위에 들어갈 때 시작되고 선언이 실행될 때까지 계속된다(초기화가 붙어 있는 상태로). 이 예에서 내부 answer는 notInitializedYet(TDZ가 시작되는 곳)의 시작 부분에 예약되고 선언이 있는 곳(TDZ가 끝나는 곳)에서 초기화된다. 따라서 let과 const는 역시 호이스트되고 var와는 다르게 호이스트된다.