호이스팅이란 모든 식별자(변수,함수,클래스 등)가 코드의 선두로(정확히는 스코프의 선두로) 끌어올려진 것처럼 동작하는것을 말한다.
자바스크립트 엔진은 소스코드를 처리할때 “소스코드의 평가” 와 “소스코드의 실행” 두가지의 과정으로 나누어 처리한다.
평가의 과정에서 “실행 컨텍스트”를 생성하게 되는데 이 “실행 컨텍스트”가 관리하는 environmentRecord에 식별자(변수,함수,클래스)를 등록한다.
즉 식별자(변수, 함수, 클래스)를 선언하는 선언문은 코드가 실행되기 전 “소스코드의 평가”과정에서 먼저 실행되기 때문에 평가가 끝난 후 (이미 스코프에 식별자가 등록된 상태이므로) 실행될땐 코드의 맨위로 끌어올려진 것처럼 동작하는 것이다.
전역변수의 호이스팅은 전역스코프의 선두로
지역변수의 호이스팅은 지역스코프의 선두로
var는 함수 레벨 스코프
let은 블록 레벨 스코프
let은 TDZ- Temporal Dead Zone에 호이스팅 된다. 초기화는 선언문에 도달했을때 일어난다.
선언단계~초기화단계 그 사이를 TDZ(일시적 사각지대)라고 한다. 이 TDZ구간에선 변수를 참조할 수 없다.
그래서 선언문이전에 호출하면 에러가 발생한다.
변수는 호이스팅이 일어나면 undefined로 초기화가된다.
그래서 변수 선언문 이전에 호출하면 undefined가 나온다.