세 가지 측면에서 차이가 있습니다: 스코프(scope), 호이스팅(hoisting) 동작, 그리고 재할당 여부입니다.
js
() {
() {
a = ;
b = ;
c = ;
}
.(a);
.(b);
}
세 가지 측면에서 차이가 있습니다: 스코프(scope), 호이스팅(hoisting) 동작, 그리고 재할당 여부입니다.
() {
() {
a = ;
b = ;
c = ;
}
.(a);
.(b);
}
var**는 함수 스코프이며, 호이스팅되어 undefined로 초기화되고, 재선언이 가능합니다. 이로 인해 예상치 못한 누수가 발생하므로 사용을 피하세요.let**은 블록 스코프({ })이며, 재할당이 가능하고, 선언 라인에 도달하기 전까지 *일시적 사각지대(temporal dead zone)*에 머뭅니다(이른 시점에 접근하면 에러가 발생합니다).const**는 블록 스코프이며 재할당할 수 없습니다. 다만 바인딩이 상수일 뿐 값 자체가 상수인 것은 아니라는 점에 유의하세요:const user = { name: "Ann" };
user.name = "Bob"; // ✅ 허용됨 — 재할당이 아니라 객체를 변경하는 것
user = {}; // ❌ TypeError — `user`를 다시 바인딩할 수 없음
기본적으로 **const**를 사용하고, 반드시 재할당이 필요할 때만 **let**으로 전환하며, 새 코드에서는 절대 var를 사용하지 마세요. 이렇게 하면 의도("이 값은 변하지 않는다")가 명확해지고, var가 가져오는 스코프 누수와 호이스팅 혼란을 피할 수 있습니다.