자바스크립트에서는 변수 선언문보다 미리 변수를 참조하는 코드가 있다면 변수가 선언되지 않았다는 ReferenceError 가 아닌 undefined 라는 값을 보여주게 됩니다. 자바스크립트는 코드를 작성한 순서대로 차례차례 읽게 되는 인터프리터 언어라고 알고 있는데 왜 이런 현상이 발생하게 되는걸까요?

자바스크립트가 런타임 이전에 코드 평가 과정을 거치면서 소스코드를 실행하기 위한 준비를 하는데 이때 모든 선언문을 자바스크립트 엔진이 미리 코드가 실행되기 전에 찾아내서 실행을 하기 때문인데요. 오늘은 자바스크립트의 변수 호이스팅에 대해서 작성해보고자 합니다.


호이스팅(hoisting)

선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트의 고유한 특징입니다.

발생 원인

소스코드가 한 줄씩 순차적으로 실행되는 시점, 런타임(runtime)이 아니라 그 이전 단계에서 자바스크립트가 소스코드안의 모든 선언문을 찾아내서 먼저 실행하기 때문입니다.

동작 과정

  1. 런타임(runtime) 이전에 소스코드의 평가 과정을 거치면서 소스코드 실행 준비.
  2. 평가 과정에서 자바스크립트 엔진이 모든 선언문을 찾고 먼저 실행.
  3. 소스코드의 평가 과정이 끝나면 모든 선언문을 제외하고 소스코드를 순차적으로 실행.

예시

스크린샷 2023-01-05 오후 1 11 04

  • 자바스크립트 엔진은 변수 선언과 값의 할당을 하나의 문으로 단축 표현한 코드를 선언문과 할당문으로 나누어 실행. (이때 선언문은 런타임 이전, 할당문은 런타임에 실행)
  • 런타임 이전에 실행되는 값이 아직 할당되어지지 않은 변수 선언문(str)에 자바스크립트가 undefined로 값을 초기화.
  • 이후 런타임에 실행되는 할당문을 통해 기존에 선언되었던 변수의 값은 undefined에서 새롭게 할당 된 문자형 타입 'banana'로 변경.