호이스팅이란?
- 변수와 함수 선언이 실행 전에 scope의 맨 위로 끌어올려지는 것처럼 보이는 동작
- 변수를 선언하기 전에 호출해도 에러가 발생하지 않음. 선언된 위치보다 상단에서 변수에 접근할 수 있는 것처럼 보임.
인터프리터 언어란?
- 한 줄씩 읽어서 즉시 실행하는 언어. 소스 코드를 직접 실행함..
- runtime에 에러 감지
- Python, JavaScript, Ruby, PHP 등
<-> 반의어: 컴파일러 언어.
- 실행 전에 전체 코드를 기계어로 변환하는 컴파일을 거친 후, 실행 파일로 실행.
- compile 단계에서 에러 감지
- C, C++, Java 등
자바스크립트에서 호이스팅이 가능한 이유?
[1] 컴파일 단계: 함수 및 변수 선언을 한 부분이 메모리에 할당 되므로, 선언된 위치보다 앞에서 접근 가능.
- var: 컴파일 단계에서 변수가 메모리에 올라감.
- 선언 즉시 undefined로 초기화 되어, 선언 전에 접근하면 undefined를 반환함.
console.log(myVar); // undefined
var myVar = 10;
console.log(myVar); // 10
- 함수 선언식: 함수 자체가 호이스팅되어, 함수 호출을 선언 이전에 해도 그대로 작동함.
console.log(myFunction()); // 'Hello World' 출력
function myFunction() {
return 'Hello World';
}
- let, const(ES6에 도입됨): TDZ(Temporal Dead Zone) 영역(변수가 선언되었지만, 초기화되기 전까지 구간) 내에 놓임.
- 초기화 되지 않으며, 선언 전에 접근하면 ReferenceError 발생.
- TDZ는 변수가 선언된 시점부터 초기화 될때까지 구간에서 변수를 사용하지 못하게 막아주는 역할.
- 특히 let 변수는 선언 자체는 호이스팅 되는데, 초기화가 호이스팅 되지 않음.
console.log(myLet); // ReferenceError 발생
let myLet = 10;
[2] 실행 단계: 컴파일 단계에서 메모리에 할당된 변수와 함수가 실행 됨.
- 변수는 값을 할당받고, 함수는 호출되면 내부 코드를 수행함.
결론: 자바스크립트 엔진은 바이트코드로 컴파일해서 실행 전에 최소한의 컴파일 과정을 가짐.
단순히 한 줄씩 바로 해석하고 실행하지 않기 때문에 인터프리터 언어임에도 호이스팅이 가능함.
(컴파일러 언어처럼 기계어로 번역하는 것은 아니고, 인터프리터가 실행할 수 있는 형식으로 변형.)
var | 선언+초기화는 호이스팅되지만 값 할당은 아님. 선언 전에 접근하면 undefined 반환함. |
함수 선언식 | 함수 자체가 호이스팅되어 선언 전에 함수 호출 해도 문제 없음. |
let, const | TDZ에 놓여서 선언 전에 접근하면 ReferenceError 발생함. |
출처
[1] 매일메일, 프론트엔드, 2025.01.10. 인터프리터 언어인 자바스크립트에서 어떻게 호이스팅이 가능한지에 대해서 설명해주세요. 45번. https://maeil-mail.kr
[2] gpt에게 인터프리터 언어 관련 질문
[3] 매일메일. 241230. 자바스크립트 호이스팅에 대해서 설명해주세요. 31번. https://maeil-mail.kr
'개발자 강화 > 프론트엔드' 카테고리의 다른 글
🌟[상상개발] 무한스크롤을 어떻게 구현하는 게 좋을까? (0) | 2025.01.23 |
---|---|
[매일메일] 낙관적 업데이트란? (FE.250121) (0) | 2025.01.21 |
[매일메일] React의 Controlled Component와 Uncontrolled Component의 차이점? (FE.241220) (0) | 2025.01.20 |
[매일메일] React의 StrictMode란? (FE.241226) (1) | 2025.01.20 |
[매일메일] React의 props와 state란? (FE.241219) (0) | 2025.01.20 |