2026년 1월 29일
호이스팅(Hoisting)이란?
1️⃣ 호이스팅(Hoisting)이란?
호이스팅(Hoisting) 이란
자바스크립트 엔진이 코드를 실행하기 전에
변수와 함수의 선언을 먼저 메모리에 등록하는 동작입니다.
⚠️ 중요한 점
- 코드가 실제로 위로 이동 ❌
- 선언만 미리 등록 ⭕
- 값 할당은 원래 위치에서 실행
2️⃣ ES6 기준 핵심 요약
ES6에서는 “선언은 호이스팅되지만, 접근은 제한된다”
이 접근 제한 구간이 바로 TDZ입니다.
3️⃣ TDZ란 무엇인가?
✅ TDZ 풀네임
Temporal Dead Zone
✅ 의미
변수는 존재하지만,
선언되기 전까지 접근이 금지된 구간
4️⃣ 가장 기본적인 예제
console.log(a); // ❌ ReferenceError
let a = 10;
왜 에러가 날까요?
5️⃣ 내부 동작을 그림으로 이해하기
📌 코드
{
console.log(a);
let a = 10;
}
📌 실행 흐름 다이어그램
스코프 진입
│
│ a 선언 등록 (호이스팅)
│ ┌─────────────────────┐
│ │ TDZ (접근 불가) │
│ │ │
│ │ console.log(a) ❌ │
│ │ │
│ │ let a = 10 ← 여기 │
│ └─────────────────────┘
│
│ a 사용 가능
│
스코프 종료
✔️ 변수 a는 존재함
❌ 하지만 TDZ 안에서는 접근 불가
6️⃣ TDZ는 언제 시작되고 끝날까?
TDZ 시작: 스코프에 진입하는 순간
TDZ 종료: 선언문(let / const / class) 실행 시점
7️⃣ let / const / class 비교
console.log(x); // ❌
let x = 1;
console.log(y); // ❌
const y = 2;
new User(); // ❌
class User {}
➡️ 모두 TDZ 적용 대상
8️⃣ 함수는 왜 다를까?
✅ 함수 선언문 (예외)
hello();
function hello() {
console.log("Hello");
}
✔️ 정상 실행
➡️ 함수 전체가 호이스팅
❌ 화살표 함수 / 함수 표현식
hello(); // ❌
const hello = () => {
console.log("Hello");
};
➡️ 변수 규칙 + TDZ 적용
9️⃣ ES6 호이스팅 + TDZ 한 눈에 정리
┌────────────────────────────────────┐
│ 스코프 시작 │
├────────────────────────────────────┤
│ 선언 등록 (Hoisting) │
│ │
│ TDZ (접근 불가 영역) ❌ │
│ │
│ let / const / class 선언문 │
│ ────────────────────────────────▶ │
│ TDZ 종료 │
│ │
│ 정상 사용 가능 ⭕ │
├────────────────────────────────────┤
│ 스코프 종료 │
└────────────────────────────────────┘
10️⃣ 왜 TDZ가 필요한가?
❌ ES5 (문제점)
console.log(total); // undefined
var total = 100;
- 에러 없음
- 버그 추적 어려움
✅ ES6 (TDZ 도입)
console.log(total); // ❌ 즉시 에러
let total = 100;
✔️ 실수 즉시 발견
✔️ 안전한 코드
✔️ 예측 가능한 실행 흐름
11️⃣ 초보자가 꼭 기억할 문장
“ES6에서 호이스팅은 TDZ를 전제로 이해해야 한다”
🔚 마무리 요약
| 개념 | 핵심 |
|---|---|
| Hoisting | 선언을 실행 전에 등록 |
| TDZ | 선언 전 접근 금지 구간 |
| 대상 | let / const / class |
| 목적 | 버그 방지, 안전성 |
📌 한 문장 요약
TDZ는
‘자바스크립트가 잘못된 접근을 막아주는 안전선’이다