호이스팅이란 모든 식별자(변수,함수,클래스 등)가 코드의 선두로(정확히는 스코프의 선두로) 끌어올려진 것처럼 동작하는것을 말한다.

자바스크립트 엔진은 소스코드를 처리할때 “소스코드의 평가” 와 “소스코드의 실행” 두가지의 과정으로 나누어 처리한다.

평가의 과정에서 “실행 컨텍스트”를 생성하게 되는데 이 “실행 컨텍스트”가 관리하는 environmentRecord에 식별자(변수,함수,클래스)를 등록한다.

즉 식별자(변수, 함수, 클래스)를 선언하는 선언문은 코드가 실행되기 전 “소스코드의 평가”과정에서 먼저 실행되기 때문에 평가가 끝난 후 (이미 스코프에 식별자가 등록된 상태이므로) 실행될땐 코드의 맨위로 끌어올려진 것처럼 동작하는 것이다.

호이스팅은 스코프 단위로 동작한다.

전역변수의 호이스팅은 전역스코프의 선두로

지역변수의 호이스팅은 지역스코프의 선두로

let과 var의 차이.

var는 함수 레벨 스코프

let은 블록 레벨 스코프

let은 TDZ- Temporal Dead Zone에 호이스팅 된다. 초기화는 선언문에 도달했을때 일어난다.

선언단계~초기화단계 그 사이를 TDZ(일시적 사각지대)라고 한다. 이 TDZ구간에선 변수를 참조할 수 없다.

그래서 선언문이전에 호출하면 에러가 발생한다.

함수의 호이스팅과 (var로 선언한)변수의 호이스팅

변수는 호이스팅이 일어나면 undefined로 초기화가된다.

그래서 변수 선언문 이전에 호출하면 undefined가 나온다.