먼저 변수가 어떻게 생성이 되는지 먼저 살펴보자면 다음과 같다.
여기서 var
로 선언된 변수는 선언단계와 초기화 단계가 한번에 이루어진다.
즉 변수를 스코프에 등록한 뒤, 메모리에 변수를 위한 공간을 확보한 후 undefined로 초기화가 된다.
따라서 변수 선언문 이전에 변수에 접근을 해도 스코프에 변수가 존재하기 때문에 에러가 발생하지 않으며
undefined를 반환한다.
이 후 할당문에 도달을 하게 되면 값이 할당된다.
console.log(poo) // undefined
var poo
poo =1 ;
console.log(poo) // 1
하지만 let
의 경우 선언된 변수를 선언문 이전에 참조하면 참조 에러(Reference Error)가 발생한다.
이는 let
키워드로 선언된 변수는 스코프의 시작에서 변수의 선언까지 일시적 사각지대(Temporal Dead Zone: TDZ)에 빠지기 때문이다.
console.log(poo) // Error
let poo
let
을 통해 선언된 변수는 var
와 달리 선언 단계와 초기화 단계가 분리되서 진행이 된다.
let
의 경우에, 초기화 단계는 변수를 선언할 때 이루어지기 때문에, 초기화 이전에 변수에 접근하려고 하면 참조 에러가 발생한다.
즉 변수가 아직 초기화되지 않았으며, 변수를 위한 메모리 공간 확보가 되지 않았기 때문이다.
여기서 스코프 시작 지점부터초기화 시작 지점까지의 구간을 일시적 사각지대(Temporal Dead Zone: TDZ)라고 부른다.
console.log(poo) / Error
let poo // 변수 선언문에 도달 했을 때 초기화 단계가 실행됨
console.log(poo) // undefined
poo = 1; // 할당 단계 실행
console.log(poo) // 1