본문 바로가기

카테고리 없음

[JavaScript]🔍호이스팅(Hoisting)이란?

0. 들어가면서

면접 준비를 하며 이런 저런 영상을 찾아보다 호이스팅에 대한 영상을 보게 되고 평소에 잘 신경 쓰지 않던 개념이라 이번에

포스팅을 하며 한 번 정리를 하고자 합니다.

 

**호이스팅(Hoisting)**은

자바스크립트의 실행 컨텍스트에서 변수와 함수 선언이 코드의 최상단으로 끌어올려지는 동작을 말합니다.


이로 인해 코드의 순서와는 다르게 작동하는 경우가 생기며,

정확히 이해하지 않으면 예기치 못한 결과나 버그를 경험할 수 있습니다.

 

 

 

 


🧠 1. 호이스팅의 기본 개념

자바스크립트는 실행 전에 변수 선언(var, let, const)과 함수 선언을 메모리에 미리 할당합니다.
다만, 할당 방식과 초기화 시점에 따라 작동 방식이 다릅니다.

console.log(a); // undefined
var a = 10;

 

위 코드에서는 a가 선언되기 전에 사용되었지만 오류가 발생하지 않고 undefined가 출력됩니다.

// 실제로는 이렇게 해석됨
var a;
console.log(a); // undefined
a = 10;
 
 
 
 

🔧 2. 변수 선언의 호이스팅 차이

선언 방식 호이스팅 여부 초기화 시점 TDZ(Temporal Dead Zone)
var ✅ 됨 undefined로 초기화 ❌ 없음
let ✅ 됨 초기화 안 됨 (에러) ✅ 있음
const ✅ 됨 초기화 안 됨 (에러) ✅ 있음

 

예시: let과 const는 선언 전에 접근하면 오류

console.log(b); // ❌ ReferenceError
let b = 5;

 

 

 


🛠️ 3. 함수 선언 vs 함수 표현식

함수 선언식 (Function Declaration)

sayHello(); // "Hello"

function sayHello() {
  console.log("Hello");
}

 

함수 선언식은 전체가 호이스팅되어 어디서든 호출 가능.

 

 

함수 표현식 (Function Expression)

sayHi(); // ❌ TypeError: sayHi is not a function

var sayHi = function () {
  console.log("Hi");
};

 

→ 변수는 호이스팅되지만, 함수는 런타임에 할당되므로 오류 발생.

 

 

 


⚠️ 4. 호이스팅 관련 흔한 실수

1. undefined 출력 예상 못함

console.log(num); // undefined
var num = 42;

 

2. TDZ로 인한 오류

console.log(x); // ❌ ReferenceError
let x = 10;

 

 


✅ 5. 올바른 코드 작성 팁

  • 항상 변수 선언은 위쪽에 몰아서 명확하게 작성
  • let/const를 기본으로 사용하여 TDZ로 안전성 확보
  • 함수는 가능하면 선언식을 사용하거나, 표현식을 선언 이후에 호출

 

 

 


📌 마무리 정리

자바스크립트의 호이스팅은 JS 엔진의 동작 방식에서 비롯된 자연스러운 현상입니다. 하지만 이를 정확히 이해하지 않으면 생각과 다른 결과가 나올 수 있어요. 호이스팅을 이해하고 예측 가능하게 작성하는 습관이 중요한 것 같습니다.

이 포스트에 이어서 ES6 이후 호이스팅 동작 정리, TDZ 심화, 면접 질문 대응 예시 등도 확장하여 포스팅할 예정입니다.

 

 

 

 

 

 

📚 참고자료