코드가 실행되기 전에 변수,함수 선언이 해당 스코프의 최 상단으로 올려진 것 같은 현상을 말한다.
흔히 자바스크립트 엔진은 코드를 실행하기 전에 미리 코드를 형상화 하고 구분하는 과정(실행컨텍스트를 위한 과정)을 거치는데, 코드를 실행 전에 모든 선언(var, let, const, function, class)을 스코프에 등록한다.
고로 코드 실행 전에 이미 변수선언,함수선언 이 저장되어 있기 때문에 선언(var a = 1)보다 호출(console.log(a))이 먼저 나와도 오류없이 동작을 한다.
그런데 이상하다, var로 선언된 변수와 달리 let으로 선언을 하면 참조에러가 발생을 한다.
let 키워드로 선언된 변수는 스코프의 시작에서 변수의 선언까지 *일시적 사각지대(Temporal Dead Zone; TDZ)에 빠지기 때문이다.
그런데 왜 오류가 나는가 하면 var 키워드는 선언과 함께 undefined로 초기화되어 메모리에 저장되는데 let과 const는 초기화되지 않은 상태로 선언만 메모리에 저장되기 때문이다.
let a = 1;
{
console.log(a);
let a = 2;
}
위 값은 에러가 발생함
초기화 되지 않으면 변수를 참조할 수 없다. 그래서 참조 에러를 일으키는 것이다.
let과 const에도 호이스팅이 일어나기 때문에 에러를 일으키는 것이다.
호이스팅이 일어나지 않는다면 아래 코드에서 에러가 발생하지 않을 것이다.
선언이 호이스팅되었기 대문에 블록 스코프에서 a를 찾을 수 없는 것이다.