var name = 'HOJUN';
console.log(name); // HOJUN
var name = 'KIMHOJUN';
console.log(name); // KIMHOJUN
let name = 'HOJUN';
console.log(name); // HOJUN
let name = 'KIMHOJUN';
console.log(name);
// Uncaught SyntaxError: Identifier 'name' has already been declared
name = 'KIMHOJUN';
console.log(name); //KIMHOJUN
const name = 'HOJUN';
console.log(name); // HOJUN
const name = 'KIMHOJUN';
console.log(name);
// Uncaught SyntaxError: Identifier 'name' has already been declared
name = 'KIMHOJUN';
console.log(name);
//Uncaught TypeError: Assignment to constant variable.
'호이스팅' 이란 var 선언문이나 function 선언문을 해당 스코프의 선두로 옮긴 것 처럼 동작하는 특성을 말한다.
JavaScript 에서는 var, let, const, function, class 을 호이스팅한다.
var은 변수 선언 이전에 해당 변수를 참조하여도 undefined를 출력하지만 let은 변수 선언 이전에 해당 변수를 참조한다면 참조 에러가 발생한다.
일반적으로 변수는 선언 단계 > 초기화 단계 > 할당 단계 에 의해 생성되는데 var 변수는 선언단계와 초기화단계가 한번에 이루어진다. 하지만 let 변수는 선언단계와 초기화 단계가 단계에 걸쳐 이루어지기 때문에 에러가 발생한다.
console.log(hoJun); // undefined
var hoJun;
console.log(hoJun); // undefined
hoJun = 1; // 할당문에서 할당 단계가 실행된다.
console.log(hoJun); // 1
console.log(hoJun); // ReferenceError: hoJun is not defined
let hoJun; // 변수 선언문에서 초기화 단계가 실행된다.
console.log(hoJun); // undefined
hoJun = 1; // 할당문에서 할당 단계가 실행된다.
console.log(hoJun); // 1