scopetdz

var, let, const의 hoisting 차이를 설명해 주세요

예상 시간
7
30초 답변

꼬리질문

조금 더 깊게 물어본다면

답변 뒤에 이어질 수 있는 질문들을 하나씩 열어볼 수 있어요.

let과 const는 hoisting되지 않는다고 말하면 틀린 건가요?

부가 설명

console.log(a); // undefined
var a = 1;
 
console.log(b); // ReferenceError
let b = 2;

var는 선언 전에도 이름을 찾을 수 있습니다. 다만 값은 아직 대입 전이라 undefined입니다.

let은 이름 자체가 없는 것처럼 보일 수 있지만, 실제로는 블록 스코프에 이미 등록되어 있습니다. 다만 선언문에 도달하기 전까지 접근할 수 없는 구간이 있고, 이 구간을 TDZ라고 부릅니다.

const는 hoisting과 TDZ 관점에서는 let과 거의 같습니다. 차이는 선언과 동시에 반드시 초기화해야 하고, 이후 재할당할 수 없다는 점입니다.

const value; // SyntaxError

다만 객체를 const로 선언했다고 해서 내부 값까지 불변이 되는 것은 아닙니다.

const user = { name: "Joon" };
user.name = "Kim"; // 가능

한 줄 정리

var는 hoisting 후 undefined로 초기화되고, letconst는 hoisting되지만 선언문 전까지 TDZ 때문에 접근할 수 없습니다.