
호이스팅(Hoisting)은 JavaScript의 고유한 동작 방식으로, 변수와 함수 선언이 실제 코드 실행 전에 메모리 상에서 자동으로 상단으로 끌어올려지는 현상입니다. 그러나, 호이스팅의 동작 방식은 변수와 함수의 선언 형태에 따라 다릅니다.
- 변수 호이스팅:
var로 선언된 변수는 선언만 호이스팅되고 초기화는 나중에 이루어집니다.- 함수 호이스팅:
함수 선언식은 코드의 어디에서든 호출할 수 있도록 완전히 호이스팅됩니다. 반면함수 표현식은 변수 선언만 호이스팅되고 함수의 할당은 나중에 이루어지므로, 선언 전에 호출하면 오류가 발생합니다.
💡 인터프리터 언어
- 개발자가 별도의 컴파일 작업을 수행하지 않는다.
- 코드가 실행되는 단계인 ‘런타임’에 한줄씩 바이트코드로 변환 후 실행한다.
- 자바스크립트는 런타임에 컴파일되며 실행 파일이 생성되지 않고 인터프리터의 도움 없이 실행할 수 없기 때문에 컴파일러 언어라고 할 수 없다!
| 항목 | 컴파일러 언어 | 인터프리터 언어 |
|---|---|---|
| 실행 방식 | 소스 코드를 한 번에 모두 컴파일하여 실행 파일 생성 후 실행 | 소스 코드를 한 줄씩 즉시 해석하며 실행 |
| 컴파일/해석 과정 | 실행 전에 전체 코드를 컴파일하여 기계어로 변환 | 실행 중에 코드 한 줄씩 해석 후 즉시 실행 |
| 속도 | 실행 속도가 빠름 (한 번 컴파일된 후에는 반복적인 해석이 불필요) | 비교적 느림 (코드를 해석하면서 실행) |
| 디버깅 | 컴파일 타임에 오류가 모두 발견됨 | 런타임 중에 오류가 발생할 수 있음 |
| 메모리 사용 | 일반적으로 실행 파일이 미리 생성되어 더 적은 메모리를 사용 | 즉시 해석 및 실행되므로 메모리 사용이 많을 수 있음 |
| 예시 언어 | C, C++, Go, Rust | Python, JavaScript, Ruby |
| 배포 | 기계어로 변환된 실행 파일을 배포 | 소스 코드 자체를 배포해야 함 |
| 플랫폼 독립성 | 플랫폼 의존적 (컴파일된 바이너리가 특정 플랫폼에서만 동작) | 일반적으로 플랫폼 독립적임 (인터프리터만 있으면 실행 가능) |
| 초기 실행 준비 시간 | 컴파일 시간이 필요하므로 느림 | 즉시 실행 가능 |
console.log(score); // undefined
var score; // 변수 선언
💡 변수 선언문이 코드의 맨 위로 끌어 올려진 것처럼 동작하는 자바스크립트의 고유특징
: 변수 호이스팅 (variable hoisting)
console.log(add); // f add(x,y)
console.log(sub); // undefined
console.log(add(2,5));
console.log(sub(2,5));
function add(x,y) {
return x+y;
}
var sub = function (x,y) {
return x-y;
}
💡 함수 선언식 vs. 함수 표현식
| 항목 | 함수 선언식 (Function Declaration) | 함수 표현식 (Function Expression) |
|---|---|---|
| 작성 방식 | function 키워드를 사용해 함수 이름과 함께 정의 | 변수에 익명 함수 또는 명명된 함수를 할당하는 방식 |
| 호이스팅 | 함수 선언이 호이스팅됨. 함수 선언 전에 호출 가능 | 변수 선언만 호이스팅되므로 함수 정의 전에 호출 불가 |
| 호출 가능 시점 | 함수 선언 이전에도 호출 가능 | 함수 정의 이후에만 호출 가능 |
| 예시 | js function foo() { ... } | js const foo = function() { ... } |
| 이름 유무 | 함수 이름이 반드시 필요함 | 익명 함수 또는 명명된 함수 모두 가능 |
| 사용 시기 | 함수가 코드 어디에서든 사용 가능하도록 정의하고 싶을 때 | 특정 조건에 따라 함수가 동적으로 정의될 때 적합 |
💡 함수 선언문이 코드의 맨 위로 끌어 올려진 것처럼 동작하는 자바스크립트의 고유특징
: 함수 호이스팅 (function hoisting)
변수 선언문 (var) → undefined로 초기화
함수 선언문 → 함수 객체로 초기화
- 선언문 이전에 호출 → 호이스팅 → 가능!
함수 표현식은…?함수 표현식은 변수에 할당되는 값이 뭘까?
- 함수 리터럴
- 변수 선언문 + 변수 할당문
- 변수 할당문의 값은 할당문이 실행되는 시점(런타임)에 평가 되므로,
함수 표현식의 함수 리터럴도 할당문이 실행되는 시점에 쳥가되어 함수 객체가 된다.
- 따라서, 함수 표현식 → 함수 호이스팅이 아니라 변수 호이스팅이 발생함!!
함수 표현식