1.호이스팅(Hoisting)이란?
자바스크립트 엔진은 코드를 실행하기 전 변수선언과 함수선언을 먼저 메모리에 올려두는 과정을 거침
실제 코드 작성 순서와 실행 순서가 달라질 수 있음
이 과정을 호이스팅(끌어 올리기) 라고 부른다.
2. 자바스크립트 실행 과정: 컴파일과 실행
자바스크립트는 코드를 한 줄씩 바로 실행 하는 것이 아닌,
먼저 컴파일 단계에서 변수와 함수 언언을 찾아 메모리에 등록
- 변수/상수 선언(var, let, const)
- 함수 선언(function)
컴파일이 끝난 뒤, 코드가 순서대로 실행
2. 함수 선언문과 호이스
함수 선언문 전체가 메모리에 올라감
greet()
function greet() {
console.log("안녕하세요!");
}
- 함수 선언문은 컴파일 단계에서 함수 전체 코드가 메모리에 등록
- 그렇기에 함수 위치가 함수 정의 위에 있어도 실행 오류 발생 안함
3. 변수 호이스팅:var vs let/const 차이
var
console.log(x); // undefined
var x = 10;
console.log(x); // 10
- var 변수는 선언만 컴파일 단계에서 끌어올려지고, 할당은 실행 단계에서 이루어짐
- console.log(x); 첫번째 호출은 선언된 상태지만 값이 할당되기 전이라 undifined 가 출력
let, const
console.log(y); // ReferenceError: Cannot access 'y' before initialization
let y = 20;
- let과 const도 선언이 호이스팅 됨
- 그러나 선언 이전에 일시적 사각지대(Temporal Dead Zone, TDZ)에 있어 접근시 에러 발생
- let과 const는 선언 전 사용시 오류 발생
4. 함수 표현식과 화살표 함수와 호이스팅
greet(); // ReferenceError: Cannot access 'greet' before initialization
const greet = function() {
console.log("안녕하세요!");
};
greetArrow(); // ReferenceError: Cannot access 'greetArrow' before initialization
const greetArrow = () => {
console.log("안녕하세요! 화살표 함수입니다.");
};
- 함수 표현식과 화살표 함수는 모두 변수에 함수를 할당 하는방식
- 변수 선언은 호이스팅 되지만 함수 값 할당은 변수 선언 이후에 이루어짐
- 때문에 변수 선언 이전에 호출시 ReferenceEorror 발생
정리
| 함수 정의 방식 | 호이스팅 대상 | 호출 가능 시점 |
| 함수 선언문 | 함수 전체 | 선언 이전 호출 가능 |
| 함수 표현식 | 변수 선언만 | 변수 선언 이후 호출 가능 |
| 화살표 함수 | 변수 선언만 | 변수 선언 이후 호출 가능 |
'개발' 카테고리의 다른 글
| [개발]🐍 Anaconda3란? 데이터 분석을 위한 최고의 시작 도구! (18) | 2025.07.31 |
|---|---|
| [Git]Part 1. Git이란? GitHub란? 왜 써야 할까? (11) | 2025.07.29 |