변수 호이스팅 (Variable Hoisting)
1.1 호이스팅이란?
1.2 var의 호이스팅
1.3 let·const의 호이스팅 차이
1.4 호이스팅에 따른 문제와 해결 방법
이벤트 전파 방식 (Event Propagation)
2.1 버블링 (Bubbling)
2.2 캡처링 (Capturing)
2.3 문제 상황: 원치 않는 중복 처리
2.4 해결 방법
JavaScript 엔진이 실행 컨텍스트를 생성할 때, 변수 선언(var, let, const)과 함수 선언을 코드 실행 전에 끌어올리는 동작을 말합니다.
var의 호이스팅console.log(x); // undefined
var x = 10;
console.log(x); // 10
undefined 반환let·const의 호이스팅 차이console.log(a); // ReferenceError: Cannot access 'a' before initialization
let a = 5;
console.log(b); // ReferenceError: Cannot access 'b' before initialization
const b = 7;
ReferenceError| 구분 | 호이스팅 시점 | 초기값 | TDZ 발생 여부 |
|---|---|---|---|
var | 선언 단계 끌어올림 | undefined | ❌ |
let | 선언 단계 끌어올림 | 없음 | ✅ |
const | 선언 단계 끌어올림 | 없음 | ✅ |
문제: 변수 선언 위치를 예측하기 어려워 가독성·버그 발생
해결
항상 선언부를 최상단 또는 사용 직전에 배치
let·const 사용: TDZ로 인해 선언 순서 준수 강제
ESLint 규칙
// .eslintrc.json
{
"rules": {
"no-var": "error",
"prefer-const": "warn",
"no-use-before-define": ["error", { "functions": false, "classes": true }]
}
}
<button> 클릭 → <div> → <body> → <html><div id="parent">
<button id="child">Click me</button>
</div>
<script>
document.getElementById('parent')
.addEventListener('click', () => console.log('parent 버블링'));
document.getElementById('child')
.addEventListener('click', () => console.log('child 클릭'));
</script>
addEventListener의 세 번째 인수에 true 전달document.getElementById('parent')
.addEventListener('click', () => console.log('parent 캡처링'), true);
stopPropagation()
child.addEventListener('click', e => {
console.log('child 처리');
e.stopPropagation();
});
이벤트 위임에서 조건 분기
event.target 또는 event.currentTarget 비교하여 필요한 요소만 처리parent.addEventListener('click', e => {
if (e.target.matches('button')) {
console.log('button 전용 처리');
}
});
once 옵션 사용
element.addEventListener('click', handler, { once: true });
캡처링/버블링 단계 분리
true)와 버블링 단계(false) 선택 등록