← 질문 목록
#79깊이 0
let도 끌어올려지는데 왜 바로 읽지 못하는가?
let과 const의 바인딩은 스코프 시작 때 만들어지지만 선언문을 평가하기 전에는 초기화되지 않는다. 이 시간적 사각지대에서 읽으면 ReferenceError가 난다.
| 기준 | var | let·const |
|---|---|---|
| 실행 전 상태 | undefined로 초기화 | 미초기화 |
| 선언 전 읽기 | undefined | ReferenceError |
| 블록 경계 | 무시 | 적용 |
호이스팅은 소스 코드를 실제로 위로 옮기는 동작이 아니다. 실행 컨텍스트를 만들 때 선언을 등록하고 각 종류의 초기화 시점을 달리하는 설명 모델이다.
함수 선언은 본문까지 일찍 바인딩되어 선언 앞에서 호출할 수 있다. 함수 표현식은 담긴 변수의 초기화 규칙을 따르므로 var와 let의 차이가 그대로 드러난다.
시간적 사각지대의 let을 typeof로 확인해도 ReferenceError가 난다. 아예 선언되지 않은 이름에 typeof를 썼을 때 undefined가 나오는 것과 다르다.