
런타임 이전에 변수가 먼저 선언되는 현상을 말한다.
실행 컨텍스트에 관한 그림들은 개념상 이해하기 편하도록 그린 거라 정확한 내용은 아니다.
자세한 내용은 다른 포스팅에서 설명하겠다.
자바스크립트 엔진은 런타임 이전과 런타임으로 나눠서 코드를 처리한다.
콜스택에 실행 컨텍스트가 생성된 후 실행되면, 런타임 이전이 진행된 이후에 런타임이 진행된다.
진행 도중에 실행 컨텍스트가 바뀌면 한 번에 런타임이 전부 완료되지 않는다.
이때는 기존에 진행 중이던 실행 컨텍스트의 런타임을 멈추고 새로운 실행 컨텍스트의 런타임 이전이 진행된다.

런타임 이전
변수를 선언하고 코드의 최상단에 위치시킨다.
변수는 var, let, const, function, function*, class 등의 키워드와 함께 선언된다.
여기서 let과 const 는 TDZ라는 개념을 가지는데 이후에 설명하겠다.
런타임
변수에 값이 할당된다.
값이 할당될 때 비로소 변수가 정의된다고 말한다.

자바스크립트 엔진의 동작을 규정한 일종의 명령어다.
var, const, let 차이
var 는 함수 레벨 스코프고, const와 let 은 블록 레벨 스코프다.

또한, const 는 값을 바꿀 수 없지만, let 은 값을 바꿀 수 있다.

TDZ(Temporal Dead Zone)
변수를 선언한 지점 이전에는 해당 변수를 사용할 수 없도록 하는 개념이다.

주의할 점은 const와 let 도 호이스팅이 되지만, TDZ에서 사용할 수 없다는 점이다.

함수선언문은 function 키워드로 선언한 변수다.
그래서 TDZ가 존재하지 않는다.
반면 함수표현식은 var(const, let) 키워드로 선언한 변수다.
var 로 선언하면 TDZ가 존재하지 않지만, const나 let 으로 선언하면 TDZ가 존재한다.
