실행 컨텍스트 생성 단계에서 발생함.
조금은 이상해보이는 이 호이스팅은 "필요하니까" 구현된 것이다.
어디에 필요한가?를 고민해보면 왜 발생하는지를 추론할 수 있다.
실행 컨텍스트가 열릴 때, 수집되는 정보들을 고려해보자.
- 데이터 참조 및 사용
- 렉시컬 스코프(scopeChaining) 환경 확인 (참조)
- Closure 형성 (참조) 등 . . .
결국 "참조"다. 우리의 코드는 항상 변수영역에 저장되어있는 메모리 주소의 데이터 영역의 값을 참조하며 돌아간다.
즉, 코드의 로직을 확인하기 위해, 가장 먼저 선행되어야 하는 불변값과 참조 데이터들을 각각 스택 메모리, 힙 메모리에 저장공간을 확보하고 각 함수의 lexicalScope(Scope Chain) 정보 등을 저장하기 위해 호이스팅이 발생한다는 것이다.
const a = 1; // 호이스팅 O
let b = 2; // 호이스팅 O
var c = 3; // 호이스팅 O
d = 4; // 호이스팅 X
- const, let, var 전부 선언(메모리 공간 확보)이 발생한다.
- var의 경우에만 선언과 동시에 undefined를 할당한다. (초기화)
- const와 let의 경우, 선언만 발생하기 때문에 변수에 할당하는 코드까지 TDZ(Temporary Dead Zone)이 발생한다.