console.log(hi); //undefined
var hi;
console.log(hello); //VM197:1 Uncaught ReferenceError: hello is not defined
at <anonymous>:1:13
let hello;
자바스크립트는 let, const를 포함하여 모든 선언(var, let, const, function, function*, class)을 호이스팅한다.
let의 변수 생성 3단계
1) 선언 단계(Declaration phase)
변수를 실행 컨텍스트의 변수 객체(Variable Object)에 등록한다. 이 변수 객체는 스코프가 참조하는 대상이 된다.
2) 초기화 단계(Initialization phase)
변수 객체(Variable Object)에 등록된 변수를 위한 공간을 메모리에 확보한다. 이 단계에서 변수는 undefined로 초기화된다.
3) 할당 단계(Assignment phase)
undefined로 초기화된 변수에 실제 값을 할당한다.
이렇게 let으로 변수 선언 후 실행되기 전 사이의 구간을 Temporal Dead Zone(TDZ)이라고 한다.