본문으로 건너뛰기

Ch4. 호이스팅

변수나 함수 선언이 코드 실행 전 스코프 최상단으로 끌어올려지는 현상호이스팅이라 한다.


4.1 닭이 먼저냐 달걀이 먼저냐

자바스크립트는 코드가 위에서부터 줄단위로 실행되기 전에
선언을 먼저 수집하고 스코프에 등록한다.

a = 2;
var a;

console.log(a); // 2

컴파일 결과는 다음과 같다:

var a;
a = 2;
console.log(a); // 2

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

컴파일 결과:

var a;
console.log(a);
a = 2;

4.2 컴파일러는 두 번 공격한다

var a = 2;

은 아래처럼 나뉜다:

var a; // 컴파일 단계
a = 2; // 실행 단계

선언만 호이스팅되고, 할당은 런타임에 실행


함수 예제

foo();

function foo() {
console.log(a); // undefined
var a = 2;
}

함수 foo는 호이스팅되어 위에서 호출 가능하다.


foo(); // TypeError
bar(); // ReferenceError

var foo = function bar() {
// ...
};

컴파일 결과:

var foo;
foo(); // TypeError (foo is undefined at runtime)
bar(); // ReferenceError (bar not in scope)

→ 함수 표현식은 호이스팅되지 않는다


4.3 함수가 먼저다

함수 선언과 변수 선언이 동시에 있을 경우, 함수가 먼저 호이스팅된다.

foo(); // 1
var foo;

function foo() {
console.log(1);
}

foo = function() {
console.log(2);
};

function foo()가 먼저 등록됨


중복 선언 시, 가장 마지막 선언이 적용된다:

foo(); // "b"

var a = true;

if (a) {
function foo() {
console.log("a");
}
} else {
function foo() {
console.log("b");
}
}

※ 위 예제는 브라우저 환경에 따라 동작 방식이 달라질 수 있음


4.4 정리하기

  • var a = 2;는 컴파일 시 var a와 런타임 a = 2로 분리된다
  • 선언문은 호이스팅되어 스코프 최상단에 등록된다
  • 함수 선언은 변수 선언보다 우선시된다
  • 함수 표현식은 호이스팅되지 않는다
  • 중복 선언에는 주의가 필요하다