[Javascript] 호이스팅 (Hoisting)
JS Hoisting, JS 호이스팅, JavaScript 호이스팅
정의
호이스팅 (Hoisting) 은 JavaScript 엔진이 코드 실행 전에 선언을 스코프의 최상단으로 끌어올리는 동작. 단, let/const 는 JS TDZ 로 접근 제한.
var 의 호이스팅
console.log(x); // undefined (에러 아님!)
var x = 5;
console.log(x); // 5
엔진의 실제 처리:
var x; // 선언만 끌어올려짐 (undefined)
console.log(x); // undefined
x = 5; // 할당은 원래 위치
console.log(x); // 5
let / const 의 호이스팅
console.log(y); // ❌ ReferenceError
let y = 5;
let/const 도 호이스팅은 되지만 JS TDZ (Temporal Dead Zone) 안에 있어 접근 불가.
function 선언의 호이스팅
foo(); // ✓ 동작
function foo() {
console.log('hi');
}
함수 선언문 전체가 호이스팅 됨 (선언 + 정의).
function expression 은 안 됨
bar(); // ❌ TypeError: bar is not a function
var bar = function() { ... };
// var 만 호이스팅, 값(함수)은 원위치
var 가 끌어올려져 undefined, 그것을 호출 → TypeError.
class 의 호이스팅
new Foo(); // ❌ ReferenceError
class Foo {}
let/const 처럼 TDZ. 실용적으로 “호이스팅 안 됨” 으로 기억.
호이스팅 우선순위
- 함수 선언 (function declaration) 이 가장 우선
- var 가 다음
- 같은 이름이면 함수 우선
console.log(typeof x); // 'function'
var x = 1;
function x() {}
console.log(typeof x); // 'number' (재할당 후)
모범 사례
- 항상 선언을 사용 직전에, 호이스팅에 의존하지 말 것
var회피,let/const사용 → 호이스팅 함정 자동 회피- 함수 expression 권장, declaration 보다 의도가 명확
자주 만나는 함정
1. var 의 전역 의도하지 않은 동작
function foo() {
if (false) {
var x = 1; // 실행 안 되지만 선언은 호이스팅
}
console.log(x); // undefined (ReferenceError 아님)
}
2. 함수 이름 충돌
console.log(x()); // 어느 함수 호출?
function x() { return 'first'; }
function x() { return 'second'; }
같은 이름 함수는 마지막 정의가 살아남음.
3. let 의 호이스팅 오해
console.log(x); // ReferenceError (호이스팅 안 된 것처럼 보임)
let x = 1;
호이스팅 자체는 되지만 TDZ 때문에 접근 불가. “호이스팅 안 됐다” 가 아니라 “TDZ 진입” 이 정확한 설명.
참고
이 글의 용어 (4개)
- [Javascript] 스코프 체인javascript
- 정의 스코프 체인 (Scope Chain) 은 변수 식별자를 해결할 때 따라가는 중첩된 의 연결 구조. 안쪽 스코프에서 찾지 못한 변수를 바깥 스코프로 차례로 검색. 시각화 변수…
- [Javascript] functionjavascript
- 정의 은 JavaScript 에서 함수를 만드는 가장 기본적인 키워드. 호이스팅, 동적 바인딩, 객체, 호출 등 과 구분되는 고유한 특성을 가진다. 함수가 값 으로 다뤄지는 의 …
- [Javascript] TDZ (Temporal Dead Zone)javascript
- 정의 TDZ (Temporal Dead Zone) 는 / / 선언이 호이스팅된 시점부터 선언문 (실행) 직전까지 의 접근 불가 구간. var 와의 비교 는 호이스팅 시 자동으로 …
- [Javascript] var / let / constjavascript
- 정의 JavaScript 의 3 가지 변수 선언 키워드. | 키워드 | 스코프 | 재할당 | 재선언 | 호이스팅 | |:---|:---|:---:|:---:|:---| | | f…
💬 댓글