호이스팅은 자바스크립트에서 변수와 함수의 선언부가 코드가 실행되기 전에 미리 메모리에 할당되는 과정이다.
변수 호이스팅
var, let, const는 호이스팅 방식에서 차이가 있다.
1. var 호이스팅
var로 선언된 변수는 호이스팅 시 초기값이 undefined로 설정된다.
console.log(a); // undefined
var a = 10;
console.log(a); // 10
위 코드는 내부적으로 아래와 같이 해석된다.
var a; // 변수 선언이 호이스팅됨 (초기값: undefined)
console.log(a); // undefined 출력
a = 10; // 값 할당
console.log(a); // 10 출력
2. let, const 호이스팅
let, const도 호이스팅은 되지만, 초기화 되지 않기 때문에 ReferenceError가 발생한다.
console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 20;
console.log(c); // ReferenceError: Cannot access 'c' before initialization
const c = 30;
let과 const는 TDZ(Temporal Dead Zone, 일시적 사각지대)를 가지기 때문에 선언 전에 접근할 수 없는 것이다.
TDZ란 변수가 선언되었지만 초기화되기 전까지 접근할 수 없는 구간을 의미한다. 즉, 변수가 선언된 위치 이전에서는 변수를 참조할 수 없으며, 참조하면 ReferenceError가 발생한다.
함수 호이스팅
함수도 호이스팅이 되지만, 함수 선언식과 표현식의 호이스팅은 차이가 있다.
1. 함수 선언식
함수 선언식은 전체 함수가 호이스팅 되기 때문에 선언 전에 호출이 가능하다.
greet(); // "Hello, world!"
function greet() {
console.log("Hello, world!");
}
위 코드는 내부적으로 아래와 같이 해석된다.
function greet() { // 함수 선언이 최상단으로 이동
console.log("Hello, world!");
}
greet(); // 정상적으로 호출 가능
2. 함수 표현식
함수 표현식은 변수에 할당하는 방식이므로, 변수 호이스팅의 규칙을 따른다.
sayHello(); // TypeError: sayHello is not a function
var sayHello = function() {
console.log("Hello!");
};
즉, sayHello 변수 자체는 호이스팅되지만, 함수는 할당되지 않은 상태이므로 실행할 수 없다.
var sayHello; // 변수 선언만 호이스팅됨 (초기값: undefined)
sayHello(); // undefined() 호출 → TypeError 발생
sayHello = function() {
console.log("Hello!");
};
자바스크립트는 코드 작성 순서대로 실행되는 것처럼 보이지만, 실제로는 변수와 함수 선언이 먼저 메모리에 할당된 후 실행된다. 이 점을 잘 알고 코드 흐름을 파악해야 에러를 방지할 수 있다.
'Javascript' 카테고리의 다른 글
| Axios와 Fetch의 차이 (0) | 2025.01.08 |
|---|---|
| JSON.stringify()와 JSON.parse() (1) | 2025.01.01 |
| 자바스크립트 Date 객체와 toLocaleDateString(), toLocaleString() (0) | 2024.12.31 |
| 자바스크립트 메서드와 원본 데이터 유지 (0) | 2024.12.31 |
| Ajax, V8 자바스크립트 엔진, 그리고 Node.js와의 관계 (1) | 2024.12.18 |