1. 선언 방식 비교
| 구분 | var | let | const | |
| 스코프 | 함수 스코프 | 블록 스코프 | 블록 스코프 | |
| 재선언 | 가능 | 불가능 | 불가능 | |
| 재할당 | 가능 | 가능 | 불가능 | |
| 호이스팅 | 됨 | 됨 | 됨 | 셋 다 호이스팅은 된다. 단 let/const는 TDZ 존재함 |
| TDZ | 없음 | 있음 | 있음 |
※TDZ (Temporal Dead Zone) 란?
: TDZ는 변수 선언(let , const)이 호이스팅은 되었지만 아직 초기화되지 않은 구간
이 구간에서는 변수에 접근하려 하면 ReferenceError가 발생함.
- 초기화란? 변수에 값을 처음으로 할당하는 것
2. 선언 시 동작 비교 (호이스팅 + TDZ 포함)
| 예시코드 | 결과 | 설명 |
| console.log(x); var x = 1; |
출력 : undefined | var는 호이스팅되며 undefined 로 초기화되기 때문에 에러 없이 실행됨. |
| console.log(y); let y = 2; |
❌ ReferenceError | let은 호이스팅 되지만 초기화 전에는 TDZ에 있어 접근 불가. |
| console.log(z); const z = 3; |
❌ ReferenceError | const도 TDZ로 인해 선언 전 접근 시 에러 발생. |
3. 선언만 가능할 수 있나??
- var ( ⭕ ) = var a;
- let (⭕) = let a;
- const (❌) = const a; ※에러 발생 const 는 선언할 때 값을 할당해야함
4. 재선언 가능 여부
| 재선언 가능 여부 | 예시 코드 | 설명 | |
| var | 가능 | var x = 1; var x = 2; |
같은 이름으로 다시 선언해도 에러 없이 덮어씀 |
| let | 불가능 | let x = 1; let x = 2; |
같은 이름으로 선언하면 SyntaxError 발생 |
| const | 불가능 | const x = 1; const x =2; |
let 과 마찬가지로 재선언시 에러 발생 |
5. 스코프의 차이
| 스코프 종류 | 예시 코드 | 설명 | |
| var | 함수 스코프 | function khj() { var x = 1; } |
블록(if, for 등)을 무시하고 함수 단위로 범위 설정 |
| let | 블록 스코프 | if (true){ let x = 1; } |
중괄호 {} 안에서만 접근 가능 |
| const | 블록 스코프 | if (true){ const x = 1; } |
let과 동일하게 블록 단위 스코프를 가졌다. |
스코프 예시
function NiceKHJ() {
if(true) {
var a = 1;
let b = 2;
const c = 3;
console.log(a) O var는 함수 스코프
console.log(b) O 블록 안에있으므로 전부 호출가능
console.log(c) O
}; // if end
console.log(a) O var 는 함수 스코프로 함수 안에만 있으면 호출가능
console.log(b) X let 과 const 는 블록스코프로 if 안에서 선언이 되었으면
console.log(c) X 해당 블록 안에서만 호출가능
}; //NiceKHJ end'면접 질문 관련' 카테고리의 다른 글
| 실행 컨텍스트란? (1) | 2025.06.16 |
|---|---|
| 자바스크립트의 this (1) | 2025.06.11 |
| 클로저 (Closure) 정리 (1) | 2025.06.09 |
| 스코프 체인 (Scope Chain) 정리 (1) | 2025.06.05 |