
JavaScript에서는 변수를 선언할 때 사용하는 키워드로 var, let, const가 있습니다.
ES6 이후부터 let과 const가 도입되며 블록 레벨 스코프(block-level scope) 개념이 강화되었고,
그에 따라 코드의 예측 가능성과 안정성이 높아졌습니다.
이번 글에서는 let, const의 특징과 블록 레벨 스코프에 대해 자세히 기술해보겠습니다.
let은 변수 재할당이 가능한 변수 선언 방식입니다.
기존의 var와 다르게 블록 스코프를 가지며, 호이스팅은 되지만 초기화는 되지 않습니다.
let x = 10;
x = 20; // 가능
console.log(x); // 20
const는 재할당이 불가능한 상수를 선언합니다.
하지만 객체(Object)나 배열(Array)을 const로 선언한 경우, 프로퍼티/요소 변경은 가능합니다.
const y = 100;
y = 200; // ❌ TypeError: Assignment to constant variable.
const obj = { name: "Lee" };
obj.name = "Kim"; // ✅ 가능
console.log(obj.name); // "Kim"
let과 const는 모두 블록 레벨 스코프를 따릅니다.
즉, 중괄호 {}로 감싸진 모든 영역(if, for, function 등)에서 지역 스코프를 가집니다.
{
let a = 1;
const b = 2;
}
console.log(a); // ReferenceError: a is not defined
console.log(b); // ReferenceError: b is not defined
반면, var는 함수 레벨 스코프를 따르기 때문에 예상치 못한 사이드 이펙트가 발생할 수 있습니다.
if (true) {
var x = 10;
}
console.log(x); // 10 (밖에서도 접근 가능)
let과 const도 호이스팅은 되지만, 일시적 사각지대(TDZ)로 인해
선언 전에 접근하려 하면 ReferenceError가 발생합니다.
console.log(a); // ❌ ReferenceError
let a = 5;
TDZ란 변수 선언은 호이스팅되어 있지만, 코드 실행 전까지 접근할 수 없는 구간을 의미합니다.
• var는 지양하고 let, const를 사용하자
• 기본적으로는 const 사용, 재할당이 필요한 경우에만 let 사용
• 블록 스코프를 통해 변수의 유효 범위를 명확하게 관리하면 예측 가능한 코드 작성이 가능해진다
• let과 const는 모두 블록 레벨 스코프를 갖는다
• const로 선언한 객체는 불변이 아니다 (단, 재할당은 불가)
• 호이스팅되더라도 TDZ로 인해 선언 전 접근은 금지된다
| 항목 | var | let | const |
|---|---|---|---|
| 재선언 | ✅ 가능 | ❌ 불가능 | ❌ 불가능 |
| 재할당 | ✅ 가능 | ✅ 가능 | ❌ 불가능 |
| 스코프 | 함수 스코프 | 블록 스코프 | 블록 스코프 |
| 호이스팅 | ✅ O | ✅ O | ✅ O |
| TDZ (일시적 사각지대) | ❌ 없음 | ✅ 있음 | ✅ 있음 |
| 초기화 필요 여부 | ❌ X (undefined) | ❌ X (선언 후 가능) | ✅ 선언과 동시에 초기화 필요 |
| 사용 권장 여부 | ❌ 지양 | ✅ 사용 권장 | ✅ 기본적으로 사용 |