브라우저가 JS를 해석할 때 호이스팅 대상이되는 코드가 위치에 관계없이 유효범위 == {} 상단으로 끌어올려지는 것
변수는 3가지 단계를 거쳐 생성된다.
- 선언단계 : 변수를 변수 객체에 등록. 이 변수 객체는 스코프가 참조하는 대상이 됨.
- 초기화단계 : 변수 객체에 등록된 변수의 공간을 메모리에 확보. 변수는 undefined로 초기화됨.
- 할당단계 : undefined로 초기화된 변수에 값을 할당.
let, const는 1,2단계가 분리되어 동작한다. 반면에
var는 1,2단계가 동시에 이루어져서 호이스팅되어 바로 메모리에 올라가기 때문에 선언이전에 변수에 접근해도 undefined가 되지만, let이나 const 그리고 함수표현식은 호이스팅되지않는다. 해당 스코프의 변수객체에 등록은 하지만, 메모리에 할당이 되지않아 참조에러가 발생한다.
- 실행 전 변수를 메모리에 할당하는 var변수, 실행문에서 선언전 호출해도 이미 실행전에 메모리에 올라가게 되어 OK인 것
- let 키워드로 선언된 변수는 선언 단계와 초기화 단계가 분리되어 진행된다. 즉, 스코프에 변수를 등록(선언단계)하지만 초기화 단계는 변수 선언문에 도달했을 때 이루어진다. 초기화 이전에 변수에 접근하려고 하면 참조 에러(ReferenceError)가 발생한다. 이는 변수가 아직 초기화되지 않았기 때문이다. 다시 말하면 변수를 위한 메모리 공간이 아직 확보되지 않았기 때문이다. 따라서 스코프의 시작 지점부터 초기화 시작 지점까지는 변수를 참조할 수 없다. 스코프의 시작 지점부터 초기화 시작 지점까지의 구간을 ‘일시적 사각지대(Temporal Dead Zone; TDZ)’라고 부른다. 출처