[JS] 호이스팅(Hoisting) 이란?

2023. 2. 13. 21:35· Front-end/JavaScript

 

# 호이스팅 이란?

 

  • 자바스크립트 엔진은 소스코드를 한 줄씩 순차적으로 실행하기에 앞서 먼저 소스코드의 평가과정을 거치면서 소스코드를 실행하기 위한 준비를 한다.
  • 소스코드의 평가 과정에서 자바스크립트 엔진은 변수 선언을 포함한 모든 선언문을 소스코드에서 찾아내 먼저 실행한다.
  • 소스코드의 평가 과정이 끝나면 변수 선언을 포함한 모든 선언문을 제외하고 소스코드를 한 줄씩 순차적으로 실행한다.
  • 자바스크립트 엔진은 선언들이 어디에 있든 상관없이 다른 코드보다 먼저 실행한다.
  • 쉽게 말해 자바스크립트 엔진이 코드를 실행하기 전 선언문을 끌어올리는 것을 말한다. 정확히 말하자면 선두도 끌어 올려진 것 처럼 동작한다.
  • 모든 식별자(변수,함수, 클래스 등)은 호이스팅 된다.

 


# 변수 호이스팅

 

변수는 3단계에 걸쳐 생성된다.

1. 선언단계 (Declaration phase)

☞ 변수를 실행 컨텍스트의 변수 객체(Variable Object)에 등록한다. 이 변수 객체는 스코프가 참조하는 대상이 된다.

 

2.초기화 단계(Initialization phase)

☞ 변수 객체(Variable Object)에 등록된 변수를 위한 공간을 메모리에 확보한다. 이 단계에서 변수는 undefined로 초기화된다.

 

3.할당 단계(Assignment phase)

☞ undefined로 초기화된 변수에 실제 값을 할당한다.

 

 var 

 

console.log(foo); // undefined
var foo; // 변수선언, 초기화가 동시에 일어남

 

  • var 키워드로 선언된 변수는 선언 단계와 초기화 단계가 한번에 이루어진다.
  • 즉, 스코프에 변수를 등록(선언 단계)하고 메모리에 변수를 위한 공간을 확보한 후, undefined로 초기화(초기화 단계)한다.
  • 따라서 변수 선언문 이전에 변수에 접근하여도 스코프에 변수가 존재하기 때문에 에러가 발생하지 않는다. 다만 undefined를 반환한다.
  • 이후 변수 할당문에 도달하면 비로소 값이 할당된다.

 

 let 

 

let foo = 1; // 전역 변수

{
  console.log(foo); // ReferenceError: foo is not defined
  let foo = 2; // 지역 변수
}

 

  • let 키워드로 선언된 변수는 선언 단계와 초기화 단계가 분리되어 진행된다.
  • 즉, 스코프에 변수를 등록(선언단계)하지만 초기화 단계는 변수 선언문에 도달했을 때 이루어진다.
  • 초기화 이전에 변수에 접근하려고 하면 참조 에러(ReferenceError)가 발생한다. 이는 변수가 아직 초기화되지 않았기 때문이다.
  • 다시 말하면 변수를 위한 메모리 공간이 아직 확보되지 않았기 때문이다.
  • 따라서 스코프의 시작 지점부터 초기화 시작 지점까지는 변수를 참조할 수 없다.
  • 스코프의 시작 지점부터 초기화 시작 지점까지의 구간을 ‘일시적 사각지대(Temporal Dead Zone; TDZ)’라고 부른다.

 

 const 

 

const foo = 1;

const foo; // SyntaxError: Missing initializer in const declaration

 

  • const 키워드는 선언, 초기화, 할당 단계가 한번에 이루어 진다.

 


# 함수 호이스팅

 

// 함수 표현식
let dog = function () {
    return '놀자!';
}; 

// 함수 선언식
function play() {
    return '그래 놀자!';
};

 

  • 함수도 호이스팅이 일어난다.
  • 하지만 함수선언식과 함수표현식은 다르게 동작한다.
  • 함수 선언식은 호이스팅 되지만 함수 표현식은 호이스팅 되지않는다.
  • 함수 표현식은 변수에 초기화를 시킨 다음에 호출이 가능하다.
  • 화살표 함수도 호이스팅 되지 않는다.

 

 

 

📌 참고

모던자바스크립트 deep dive

poiemaweb | let,const

저작자표시 (새창열림)

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

[JS] 자바스크립트 라이브러리 - Swiper로 슬라이드 구현하기  (0) 2023.11.24
[JS] 자바스크립트 라이브러리 - GSAP로 애니메이션 처리하기  (0) 2023.11.15
[JS] 비동기 - callback / Promise / async · await  (1) 2023.01.16
[JS] 스프레드 문법과 구조분해할당  (0) 2023.01.14
[JS] 고차함수(Higher-Order function , HOF)  (0) 2023.01.13
'Front-end/JavaScript' 카테고리의 다른 글
  • [JS] 자바스크립트 라이브러리 - Swiper로 슬라이드 구현하기
  • [JS] 자바스크립트 라이브러리 - GSAP로 애니메이션 처리하기
  • [JS] 비동기 - callback / Promise / async · await
  • [JS] 스프레드 문법과 구조분해할당
개발중인제이
개발중인제이
제이로그개발중인제이 님의 블로그입니다.
개발중인제이
제이로그
개발중인제이
전체
오늘
어제
  • 분류 전체보기 (100)
    • 기록 (6)
      • 회고 (1)
      • TIL (4)
      • 일상 (0)
      • 리뷰 (1)
    • Web (4)
    • Front-end (81)
      • HTML & CSS (4)
      • JavaScript (9)
      • 모던자바스크립트 (14)
      • React (21)
      • Next (6)
      • TypeScript (11)
      • git & github (2)
      • etc (14)
      • 프로젝트 (0)
    • Back-end (0)
    • 알고리즘 & 자료구조 (0)
    • 패스트캠퍼스 (8)
    • 기타 (1)

블로그 메뉴

  • 홈
  • 글쓰기
  • 관리

공지사항

인기 글

최근 글

hELLO · Designed By 정상우.v4.2.2
개발중인제이
[JS] 호이스팅(Hoisting) 이란?
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.