Chapter 15 let, const 키워드와 블록 레벨 스코프
in Frontend / Js / Javascript
let, const keyword and block level scope
15.1 var 키워드로 선언한 변수의 문제점
- ES6 이전에는
var키워드로만 변수 선언 - 문제 많았음
- 변수 중복 선언 허용,
var y;하면 없는 것 처럼 인식 - 함수 레벨 스코프임 (if, for문 내에 선언해도 함수 전체에서 접근 가능!!)
- 호이스팅으로 인한 문제 (선언부만 끌어올려짐)
- 변수 중복 선언 허용,
15.2 let 키워드
- 변수 중복 선언 금지 (
SyntaxError) - 블록 레벨 스코프 (else
ReferenceError) - 변수 호이스팅
📌 호이스팅이 발생하지 않는 것처럼 동작함!
var let 선언 시 JS Engine에 존재알림 선언 시 초기화 X 선언 시 undefined로 초기화 할당선언, 초기화 단계 분리 TDZ (Temporal Dead Zone): 일시적 사각지대 발생
console.log(x); // ReferenceError (TDZ) let x; console.log(x); // undefined x = 1; console.log(x); // 1
⚠️ 발생하지 않는 ‘것’ 같아 보이지만, 실제로는 발생하는 것이므로 주의!
let x = 1; // 전역 변수
{
// x hoisted here;
console.log(x); // ReferenceError (그래서 1이 아님)
let x = 2; // 블록 레벨 스코프
}
- JS: 모든 선언 (
let,const,class,function..)을 호이스팅 let,const,class키워드로 선언한 변수는 호이스팅이 발생하지 않는 것처럼 동작
15.3 const 키워드
선언과 동시에 할당 필수
- 마찬가지로 블록 레벨 스코프, 변수 호이스팅 발생 안 하는 것처럼 동작
- 미할당 시
SyntaxError
재할당 금지 (
TypeError)- but not ‘불변’
- -> 프로퍼티 동적 생성 가능 (객체, 배열 등)
- 단, const 의 객체 prop은 재할당 가능 (객체 자체는 변경 불가능)
상수
- 상수는 = 재할당이 금지된 변수 (변수 \(\leftrightarrow\) 상수 가 아님)
2회독 노트
| 변수 type | var | let | const |
|---|---|---|---|
| 중복선언 | O | X (Syntax Error) | X (Syntax Error) |
| 스코프 | function-level | block-level | block-level |
| 호이스팅 | O ( 선언 전 접근 가능 -> undefined ) | ▲ ( 선언 전 접근 시 TDZ, reference error ) | ▲ ( let과 마찬가지 ) |
| 선언 시 | 선언 + 초기화 동일 (undefined) / 할당 | 선언 (hoisted) / 초기화 (initialized)/ 할당 | 선언 / 초기화 + 할당 |
| 재할당 허용 | O | O | X |
| 선언 생명주기 | ![]() | ![]() | ![]() |
let, const 키워드는 호이스팅이 발생하지 않는 것처럼 동작하지만, 실제로는 발생하는 것이므로 주의!
let foo = 1; { console.log(foo); // ReferenceError let foo = 2; }- hoisting이 발생하지 않을 시:
ReferenceError대신1을 출력해야 한다 var처럼 hositing 동작 :undefined를 출력해야 한다
- hoisting이 발생하지 않을 시:
const는 재할당 금지 BUT NOT 불변- 재할당 금지 뜻: const 자체에 새로운 객체 할당은 안됨 (같은 reference 를 참조해야함)
- 불변은 아니라는 뜻: object props는 변경 가능 (동적 생성, 삭제, 수정 등)


