변수는 3단계의 과정이 있다.
선언과 초기화가 동시에 이루어진다.
console.log(msg); // undefined
var msg = 'Hello World';
선언과 초기화가 분리되어 진행된다.
console.log(msg); // Uncaught ReferenceError: Cannot access 'msg' before initialization
let msg = 'Hello World';
또한 let은 재선언은 안되지만 재할당은 가능하다.
let msg = 'Hello World';
let msg = 'hi'; // Identifier 'msg' has already been declared
console.log(msg);
let msg = 'Hello World';
msg = 'hi';
console.log(msg); // "hi"
const로 선언된 변수는 재선언과 재할당을 할 수 없다.
const msg = 'Hello World';
msg = 'hi';
console.log(msg); // Uncaught TypeError: Assignment to constant variable.
변수의 선언문을 유효 범위의 최상단으로 끌어올린다.
const/let은 스코프 최상단에서 선언은 실행되지만 초기화 및 할당은 변수선언문에 도달했을 때 실행된다.
이것을 더 자세히 이해하기 위해서는 TDZ를 알아야한다.
참조: Don't Use JavaScript Variables Without Knowing Temporal Dead Zone