Pandaman Blog

[JS] Javascript의 함수 호이스팅 (Hoisting) 본문

Front end/Javascript

[JS] Javascript의 함수 호이스팅 (Hoisting)

oyg0420 2020. 1. 16. 22:59

Javascript 함수 호이스팅(Hoisting)

호이스팅(Hosting)은 코드 구문이 실행하기 전에 변수 및 함수 선언이 해당 범위의 맨 위로 이동하는 Javascript 메커니즘입니다.

위 설명을 정확하게 이해하기 위해 예제를 만들어 테스트를 해봤습니다.

introduce('oyg0420'); // my name is oyg0420

function introduce(name) {
  console.log(`my name is ${name}`);
}

함수가 선언이 되기 전에 호출을 했는데, 결과는 에러 없이 정상적으로 작동합니다. 그렇다면 위와 같은 구문이 작동되는 이유에 대해 알아보겠습니다. 자바스크립트에서는 스코프 전체를 살펴보고 함수 선언을 맨 위로 끌어올리기 때문입니다.

그렇다면 어떤 방식으로 함수를 선언해야 호이스팅이 되는 걸까요?

sayHello('oyg0420');

const sayHello = function(name) {
  console.log(`hi, ${name}`);
}

위 예제는 함수 표현식으로 작성된 함수인데요, 함수가 선언되기 전에 호출을 해봤습니다. 결과는?
VM737:1 Uncaught ReferenceError: Cannot access 'sayHello' before initialization at <anonymous>:1:1
접근할 수 없다는 에러가 발생합니다.

결국 함수 호이스팅은 함수 선언식으로 작성된 경우에만 적용된다는 것을 알 수 있었습니다.

 

그렇다면, 함수내에서의 호이스팅은 어떻게 적용되는 것일까?

sum(2, 4); // VM853:1 Uncaught TypeError: sum is not a function
function f1() {
  sum(2, 4);

  function sum(a, b) {
    console.log(a + b);
  }
}

f1(); // 6

함수선언이 이루어진 함수 외부에서의 함수 호출로 에러가 발생했습니다. 함수선언과 같은 범위에 있는 함수 호출은 올바른 값이 반환되었습니다.

 

위 예제들로 전역 범위, 함수 범위에 따라서 다르게 동작한다는 것을 알 수 있었습니다.
전역 범위는 최상단에 끌려 올라가고, 함수 범위에서는 해당 함수의 최상단에 올려진다는 것을 알 수 있었습니다.

 

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

'Front end > Javascript' 카테고리의 다른 글

[JS] Javascript의 this란?  (0) 2020.01.19
[JS] Javascript의 즉시 실행 함수 (IIFE)  (6) 2020.01.19
[JS] Javascript의 Arguments 객체  (0) 2020.01.14
[JS] Javascript의 Function (함수)  (0) 2020.01.11
[JS] Javascript의 Date객체  (0) 2020.01.07
Comments