var x = 1;
if (true) {
var x = 10; // x 변수가 중복선언되어 변수값이 변경되는 부작용이 생긴다.
}
console.log(x); // 10
console.log(foo); // undefined
foo = 123;
console.log(foo); // 123
var foo;
let foo = 1; // 전역 변수
{
let foo = 2; // 지역 변수
let bar = 3; // 지역 변수
}
console.log(foo); // 1
console.log(bar); // ReferenceError: bar is not defined
console.log(foo); // ReferenceError: foo is not defined
let foo;
let 키워드로 선언한 변수는 선언단계와 초기화 단계가 분리되어 진행되어 변수 호이스팅이 발생하지 않는 것처럼 동작한다. 하지만 자바스크립트는 let과 const를 포함한 모든 선언을 호이스팅 하기 때문에 아래와 같은 애러가 발생한다.
let foo = 1; // 전역 변수
{
console.log(foo); // ReferenceError: Cannot access 'foo' before initializtion
let foo = 2; // 지역 변수
}
let 키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 아니며, window.foo와 같이 접근할 수 없다. let의 전역 변수는 보이지 않는 개념적인 블록 내에 존재하게 된다.