[JS] 호이스팅(Hoisting)

2022. 2. 19. 00:40·FE/Javascript
반응형

호이스팅(Hoisting)


호이스팅이란 "끌어올린다"는 뜻으로 변수 및 함수 선언문이 스코프 내의 최상단으로 끌어 올려지는 현상을 말한다. 이는 인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것을 의미한다.
 
호이스팅 시 var 키워드로 선언한 변수의 경우 undefined 값으로 변수를 초기화한다.
 
console.log(num1); // undefined
var num1 = 6; // 선언, 초기화
console.log(num1); // 6

 

컴파일러는 자바스크립트 엔진이 인터프리팅하기 전에 컴파일을 하는데, 이 때 var num1 = 6;을 2개의 구문으로 여긴다.

  • var num1
  • num1 = 6

var num1은 변수 선언문으로, 컴파일을 할 때 처리하고 num1 = 6은 실행할 때까지 내버려둔다. 따라서 변수 num1이 호이스팅되고 콘솔에는 undefined가 출력된다.

 

console.log(num2); // Uncaught ReferenceError: num2 is not defined
num2 = 6; // 초기화

 

두 번째 코드의 경우 선언 없이 초기화만 존재한다. 따라서 호이스팅도 없고, 변수를 읽으려는 시도에서 ReferenceError가 발생한다.

let과 const의 호이스팅

let과 const로 선언한 변수도 호이스팅의 대상이지만, var과 달리 호이스팅 시 변수를 초기화하지는 않는다. 따라서 변수 초기화 전에 참조하는 코드가 먼저 나오면 예외가 발생한다.

 

console.log(num3); // Uncaught ReferenceError: num3 is not defined
let num3 = 6;

함수 호이스팅

함수 호이스팅에서 주의할 점은 함수 선언문은 호이스팅되지만 함수 표현식은 호이스팅되지 않는다는 것이다.

 

함수 선언문

 

func(); // 출력 결과: 함수 호이스팅
function func() { console.log('함수 호이스팅'); }

 

함수 표현식

 

func(); // Uncaught TypeError: func is not a function
var func = function() {}

 

함수 표현식의 경우 변수 func의 호이스팅이 발생해 ReferenceError가 발생하지 않지만, 그 값이 undefined이기 때문에 호출 시 TypeError가 발생한다.

 

또한 동일한 이름의 변수 선언문과 함수 선언문이 있을 경우 함수 선언문이 먼저이다.

 

func(); // 출력 결과: 함수 호이스팅
var func = function(){ console.log('변수 호이스팅') }
function func() {
  console.log('함수 호이스팅');
}

 

위의 경우 함수 선언문과 변수 선언문(= 함수 표현식)이 있지만 함수 선언문의 호이스팅이 먼저이기 때문에 콘솔에 함수 호이스팅이라는 값이 출력된다.


참고

 

https://github.com/baeharam/Must-Know-About-Frontend/blob/main/Notes/javascript/hoisting.md
https://developer.mozilla.org/ko/docs/Glossary/Hoisting
반응형

'FE > Javascript' 카테고리의 다른 글

[JS] ES6의 특징 (2) - 템플릿 리터럴, 반복자, for ... of  (0) 2022.03.07
[JS] ES6의 특징 (1) - const와 let, 화살표 함수  (0) 2022.02.28
[JS] 자바스크립트로 모멘텀(Momentum) 만들기  (0) 2021.09.07
[JS] filter 함수란?  (0) 2021.09.02
[HTML][JS] script 태그는 어디에 위치해야 할까?  (0) 2021.09.02
'FE/Javascript' 카테고리의 다른 글
  • [JS] ES6의 특징 (2) - 템플릿 리터럴, 반복자, for ... of
  • [JS] ES6의 특징 (1) - const와 let, 화살표 함수
  • [JS] 자바스크립트로 모멘텀(Momentum) 만들기
  • [JS] filter 함수란?
SH_Roh
SH_Roh
  • SH_Roh
    혼자공부끄적끄적
    SH_Roh
  • 전체
    오늘
    어제
    • 분류 전체보기 (159)
      • FE (39)
        • HTML, CSS (3)
        • Javascript (17)
        • React (11)
        • Next.js (4)
      • Network (1)
      • DevOps (4)
      • Git (1)
      • Trouble Shooting (24)
      • Algorithm (41)
        • Python (2)
        • Data Structure, Algorithm (7)
        • Problem Solving (31)
      • Education (23)
        • Elice AI Track (4)
        • Wanted Pre-Onboarding FE Co.. (19)
      • TIL (25)
      • Etc. (1)
        • 회고 (1)
        • 그냥저냥 (0)
  • 링크

    • Github
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
SH_Roh
[JS] 호이스팅(Hoisting)
상단으로

티스토리툴바