호이스팅

호이스팅(hoisting)의 정의

  • hoist 의 사전적 정의는 ‘끌어올리다’.
  • 후선언된 변수나 함수가 해당 Scope 에서 최상위로 끌어올려지는 것을 뜻한다. 즉 변수 선언문이 유효범위 안의 제일 상단부로 끌어올려지게 되고, 선언문이 있던 자리에서 초기화가 이루어지는 결과를 갖는다. 그 덕에 뒤에서 선언된 함수들과 변수들을 그 전에 사용할 수 있다.
  • 여기서 끌어올려지는 것은 할당이 아니라 선언이다.
  • 함수 선언문 방식일 때만 호이스팅이 된다. 함수 표현식으로 정의한 함수는 호이스팅이 되지 않는다.

예시 1

add(2, 3); //5

function add(x, y) {
  return x + y;
}

add(3, 4); //7

add() 함수가 정의되지 않았음에도 불구하고 add(2,3)은 제대로 호출된다. add() 함수가 최상위로 끌어올려졌기 때문이다.
호이스팅에 의해 자바스크립트 인터프리터는 코드를 아래와 같이 인식한다.

function add(x, y) {
  return x + y;
}

add(2, 3);
add(3, 4);

예시 2

function myFunc() {
  console.log(x); //undefined
  var x = 10;
  console.log(x); //10
}

myFunc();

다른 언어의 경우에는 변수 x 를 선언하지 않고 출력하면 오류 메세지를 출력한다. 하지만 자바스크립트에서는 undefined 라고 출력되고 그냥 넘어간다. var x;가 스코프의 최상단으로 끌어올려졌기 때문이다(호이스팅). 작동 순서에 맞게 코드를 재구성하면 다음과 같다.

function myFunc() {
  var x;
  console.log(x); //undefined
  x = 10;
  console.log(x); //10
}

myFunc();