📌 You don't know JS와 https://poiemaweb.com/ 를 참고하여 작성한 글입니다.
console.log(foo); // undefined
var foo;
console.log(bar); // Error: Uncaught ReferenceError: bar is not defined
let bar;
변수는 3단계에 걸쳐 생성이 됩니다.
var는 선언단계와 초기화단계가 한번에 이뤄집니다. 스코프에 변수를 등록(선언 단계)하고 메모리에 변수를 위한 공간을 확보한 후, undefined로 초기화(초기화 단계)합니다.! 따라서 변수 선언문 이전에 변수에 접근해도 undefined를 반환합니다.
그러나 let은 선언단계와 초기화단계가 분리되어 진행됩니다. 즉 스코프에 변수를 등록하지만 초기화 단계는 변수 선언문에 도달했을 때 이뤄집니다. 그래서 ReferenceError가 발생합니다. 초기화 이전에 변수에 접근하려고 하면 참조 에러(ReferenceError)가 발생합니다.
스코프의 시작 지점부터 초기화 시작 지점까지의 구간을 ‘일시적 사각지대(Temporal Dead Zone; TDZ)’라고 부른다.
let foo = 1; // 전역 변수
{
console.log(foo); // ReferenceError: foo is not defined
let foo = 2; // 지역 변수
}
전역변수 foo의 값이 출력될것 같지만 호이스팅이 발생되기 때문에 ReferenceError가 발생합니다.!