<aside> 💡 var 키워드로 선언한 변수는 중복 선언이 가능하다. var 키워드로 선언한 변수는 오직 함수의 코드 블록만을 지역 스코프로 인정한다.
var 키워드로 선언하면 변수 호이스팅으로 인해 선언문 이전에 참조가 가능하다.
</aside>
let 키워드로 이름이 같은 변수를 중복 선언하면 문법 에러가 발생한다.
let키워드는 블록 레벨 스코프를 따른다.
let foo = 1; // 전역 변수
{
let foo = 2; // 지역 변수
let bar = 3; // 지역 변수
}
console.log(foo); // 1
console.log(bar); // ReferenceError: bar is not defined
let 키워드는 호이스팅이 발생하지 않는 것 처럼 동작한다.
console.log(foo); // ReferenceError: foo is not defined
let foo;
let 키워드는 선언단계와 초기화단계가 분리되어 진행된다.
스코프의 시작지점부터 초기화 시작 지점까지 변수를 참조할 수 없는 구간을 **일시적 사각지대(Temporal Dead Zone; TDZ)**라고 한다.
let foo = 1; // 전역 변수
{
console.log(foo); // ReferenceError: Cannot access 'foo' before initialization
let foo = 2; // 지역 변수
}
호이스팅이 발생하지 않는다면, 위 예제는 전역변수 foo를 출력해야 한다. 하지만 호이스팅이 발생하기 때문에 참조 에러가 발생한다.