
let과const로 선언한 변수의 경우 호이스팅 시 변수를 초기화하지 않는다. (var로 선언한 변수의 경우 호이스팅시 undefined로 초기화한다.)
varlet, const, fuction, class등 선언은 호이스팅 대상이다.function catName(name) {
console.log("제 고양이의 이름은 " + name + "입니다");
}
catName("호랑이");
// "제 고양이의 이름은 호랑이입니다"
catName("호랑이");
// "제 고양이의 이름은 호랑이입니다"
function catName(name) {
console.log("제 고양이의 이름은 " + name + "입니다");
}
함수 호출이 함수 자체보다 앞서 존재하지만 코드는 동작한다. JavaScript에서 실행 맥락이 동작하는 방식이다.

위는 함수 선언식이며, 아래는 함수 표현식이다. 두 경우 모두 호출 후 함수를 선언한 경우이다. let 함수 표현식은 ReferenceError가 발생한다.
let과 선언된 변수는 선언문 이전에 참조하면 ReferenceError가 발생한다. 그래서 마치 호이스팅이 일어나지 않는 것처럼 보이지만 var처럼 undefined로 변수를 초기화하지 않기 때문에 그렇게 보일 뿐 호이스팅은 일어난다. const는 애초에 초기값이 없이 선언만 하면 에러가 발생한다.
// var vs let
console.log(bar); // undefined
console.log(foo); // ReferenceError
var bar = 1;
let foo = 2;
// const
const baz // Missing initializer in const declaration
let test // 초기화
console.log(test) // -> 결과는 undefined
var변수는 선언 전에 접근하면 undefined입니다.
let변수는 초기화하기 전에는 읽거나 쓸 수 없습니다.
let은 선언과 초기화 단계가 분리되어 진행된다. 따라서 변수의 초기화를 수행하기 전에 읽는 코드가 먼저 나오면 에러가 발생한다!
‘변수 스코프의 맨 위’에서부터 ‘변수의 초기화 완료 시점까지의 변수’는 "시간상 사각지대"(Temporal Dead Zone, TDZ)에 포함된 변수라고 말한다.

시간상 사각지대는 코드의 위치가 아니라 코드의 실행순서에 의해 형성된다. 변수의 스코프 시작 지점부터 초기화 전(노란색 영역)에 letVar가 있지만, func() 함수가 호출되지 않았으므로 예시는 정상적으로 작동한다. 실제 함수의 호출은 TDZ 영역 밖에서 일어난다.