호이스팅(Hoisting)
호이스팅(Hoisting)은 변수 선언과 함수 선언이 코드의 실행 시점에 "끌어올려지는" 현상을 의미합니다.
자바스크립트 코드가 실행되기 전에 변수와 함수의 선언이 최상단으로 이동
하게 되며, 값 할당은 이동하지 않고 변수나 함수 선언만 이동합니다.
변수 호이스팅
자바스크립트에서 변수는 var
, let
, const
키워드를 사용하여 선언할 수 있으며, 호이스팅의 동작은 각 키워드에 따라 다릅니다.
var로 선언된 변수의 호이스팅
var
로 선언된 변수는 선언이 호이스팅되어 최상단으로 이동하지만, 초기화(값 할당)는 이동하지 않습니다.
따라서 선언된 변수를 사용하기 전에 값이 할당되었는지에 따라 값이 undefined
로 나타날 수 있습니다.
console.log(x); // undefined
var x = 5;
console.log(x); // 5
호이스팅 동작은 내부적으로 다음과 같이 변환됩니다.
var x;
console.log(x); // undefined
x = 5;
console.log(x); // 5
let, const로 선언된 변수의 호이스팅
let
과 const
로 선언된 변수 역시 호이스팅이 발생하지만, 초기화 전까지는 사용할 수 없습니다.
이 구간을 일시적 사각지대(Temporal Dead Zone, TDZ)라고 하며 초기화 전에 접근하면 ReferenceError
가 발생합니다.
console.log(x); // ReferenceError: Cannot access 'x' before initialization
let x = 5;
함수 호이스팅
자바스크립트에서는 함수 선언도 호이스팅이 발생합니다. 함수 선언은 var
와는 다르게 함수 선언 전체가 호이스팅됩니다.
함수 선언
console.log(foo()); // "Hello"
function foo() {
return 'Hello';
}
호이스팅 동작은 내부적으로 다음과 같이 변환됩니다.
function foo() {
return 'Hello';
}
console.log(foo()); // "Hello"
함수 표현식
그러나 함수 표현식은 호이스팅되지 않습니다. 함수 표현식은 변수에 함수를 할당하는 형태이므로, 변수의 호이스팅과 마찬가지로 선언만 호이스팅되고 초기화는 Temporal Dead Zone(TDZ)에 존재합니다.
console.log(foo()); // TypeError: foo is not a function
var foo = function () {
return 'Hello';
};
요약
변수 선언
var는 호이스팅되어 최상단으로 올라가지만 값 할당은 원래 위치에 남고, let과 const는 호이스팅되지만 초기화 전에 접근하면 에러가 발생합니다.
함수 선언
함수 선언문은 선언과 정의가 함께 호이스팅되어 코드 어디서나 사용할 수 있습니다.
함수 표현식
함수 표현식은 변수 선언처럼 동작하며, 초기화가 이루어지기 전에 사용할 수 없습니다.
'개발 > 자바스크립트' 카테고리의 다른 글
자바스크립트 개발자라면 알아야 할 33가지 개념 - 5. 동등 연산자 vs 일치 연산자 vs typeof (4) | 2025.06.11 |
---|---|
자바스크립트 개발자라면 알아야 할 33가지 개념 - 4. 암묵적, 명시적, Nominal, 구조적 및 덕 타이핑 (0) | 2025.06.10 |
자바스크립트 값 타입 vs 참조 타입: 스택과 힙 메모리로 완벽 이해 (1) | 2025.06.09 |
자바스크립트 원시 타입 완전 정리 - 7가지 Primitive Types 한눈에 보기 (0) | 2025.06.09 |
자바스크립트 콜 스택(Call Stack) 완벽 가이드 - 실행 흐름을 추적하는 핵심 개념 (1) | 2025.06.04 |