자바스크립트에서 var, let, const 는 모두 변수를 선언할 때 사용하지만, 범위(scope), 재할당 가능 여부, 호이스팅(hoisting) 동작 등에서 중요한 차이가 있습니다.
✅ var vs let vs const — 핵심 차이
| 구분 | var | let | const |
|---|---|---|---|
| 선언 범위(Scope) | 함수 스코프(function scope) | 블록 스코프(block scope) | 블록 스코프(block scope) |
| 재선언 가능 여부 | ✅ 가능 | ❌ 불가능 | ❌ 불가능 |
| 값 재할당 | ✅ 가능 | ✅ 가능 | ❌ 불가능 |
| 호이스팅 | ✅ 일어나며, 값은 undefined 로 초기화 | ✅ 선언만 호이스팅, 초기화 X → 사용하는 순간 오류 | ✅ 선언만 호이스팅, 초기화 X → 사용하는 순간 오류 |
✅ 1) var (오래된 방식 – 되도록 사용 안함)
var a = 10;
var a = 20; // 재선언 가능 → 문제 발생 가능
console.log(a); // 20
✅ 함수 스코프
❌ 블록 스코프가 아니라 아래처럼 오류 없이 출력됨:
if (true) {
var x = 1;
}
console.log(x); // 1 (블록 밖에서도 접근 가능) ← 위험
✅ 2) let (일반적 변수 선언)
let b = 10;
b = 20; // 재할당 가능
console.log(b); // 20
✅ 블록 스코프
❌ 재선언 불가
if (true) {
let y = 1;
}
console.log(y); // ReferenceError (블록 밖 접근 불가)
✅ 3) const (상수 선언, 변하지 않는 값)
const c = 10;
c = 20; // ❌ TypeError: Assignment to constant variable
✅ 블록 스코프
✅ 상수라서 재할당 불가
❗ 단, 객체나 배열은 내부 값 변경 가능
const obj = { a: 1 };
obj.a = 2; // ✅ OK
console.log(obj.a); // 2
const arr = [1,2];
arr.push(3); // ✅ OK
✅ 호이스팅 동작 비교
console.log(a); // undefined
var a = 10;
var는 호이스팅되며 undefined로 초기화됨
console.log(b); // ReferenceError
let b = 10;
let은 선언만 올라가고 초기화는 안됨 → 초기화 전 사용하면 오류
console.log(c); // ReferenceError
const c = 10;
const도 동일
✅ 요약: 실무에서 어떻게 쓰나?
✔ var는 사용 지양 (스코프 문제 많음)
✔ 값이 바뀔 수 있으면 let
✔ 절대 바뀌지 않는 값이면 const
✅ 예제
const API_URL = "https://test.com/api"; // 변경되지 않는 값
let count = 0; // 변경 가능
count++;
var oldStyle = true; // 가급적 사용 ❌
