본문 바로가기

JavaScript/Behind the Scenes

Hoisting

호이스팅(hoisting)이란?

-선언되기 이전에 참조 혹은 호출을 먼저 실행 할 수 있다. 즉, 변수(또는 함수, 클래스 등)가 scope의 최상단으로 끌어올려지는 것처럼 보이는 현상을 말한다.

-parsing 단계에서 자바스크립트 엔진은 코드를 읽으면서 모든 선언문에 대해 메모리 공간을 미리 할당하고 초기값을 저장한다.

-코드가 실행되는 과정을 조금 더 자세히 살펴보면, 모든 Execution Context의 creation phase에서 변수는 Variable Environment 객체의 new properties로 생성된다. 동시에 VE 객체에 scope 프로퍼티 또한 생성되고 이 scope 내(혹은 하위 스콥)에서 변수에 대한 접근이 허용된다. 

-주의할 점은 호이스팅은 선언과 할당을 분리하여 생각해야한다. 호이스팅은 해당 변수의 존재만 알 뿐 그 변수에 실제로 할당될 값을 미리 알지는 못한다.

-그러므로, 만약 선언 코드 없이 할당 코드만 존재할 경우엔 ReferenceError를 내보낸다. 

-function 키워드로 선언한 함수는 선언과 동시에 할당이 일어나기 때문에 호출이 선언보다 먼저 실행될 수 있다.

-할당문이 실행될 때까지 변수에는 특정 초기값이 저장되는데, 이 초기값은 Declaration 방식에 따라 조금씩 다르게 나타난다.

  1. Function declaration : function body를 초기값(initial value)으로 갖는다. (호이스팅은 함수 선언문에서만 사용)

    *function expression and arrow function : depends on variable keyword(const / let)

  2. 'var' variable declaration : undefined를 초기값으로 갖는다.

  3. 'const/let' variable declaration : TDZ(Temporal Dead Zone) 내에서 Uninitialized로 설정된다. 접근시 ReferenceError를 내보낸다.

    *TDZ(Temporal Dead Zone) : 해당 변수의 scope 시작점부터 변수가 선언되는 지점까지를 일컫는 말임

 

*호이스팅은 작성 순서가 아닌 실행 순서에 의해 발생한다.

function foo () {
  console.log(boo);
}
// 코드 위치만 봐서는 여기가 TDZ임
let boo = 3;

func(); // 3 (호이스팅이 일어나지 않았다)

'JavaScript > Behind the Scenes' 카테고리의 다른 글

HTML에 자바스크립트 파일 로드하기  (0) 2022.09.09
Event Loop  (0) 2022.07.28
Execution Context & Scoping  (0) 2022.07.11
-JavaScript-  (0) 2022.07.11