호이스팅 TDZ

lim1313·2021년 8월 4일
0

TILPLUS

목록 보기
2/40
post-custom-banner

호이스팅

  • 호이스팅(Hoisting)이란, var 선언문이나 function 선언문 등을 해당 스코프의 선두로 옮긴 것처럼 동작하는 특성
  • JS는 let, const를 포함하여 모든 선언(var, let, const, function, function*, class)을 호이스팅한다.

변수 3단계 생성

  • 선언 단계(Declaration phase)
    변수를 실행 컨텍스트의 변수 객체(Variable Object)에 등록한다. 이 변수 객체는 스코프가 참조하는 대상이 된다.
  • 초기화 단계(Initialization phase)
    변수 객체(Variable Object)에 등록된 변수를 위한 공간을 메모리에 확보한다. 이 단계에서 변수는 undefined로 초기화된다.
  • 할당 단계(Assignment phase)
    undefined로 초기화된 변수에 실제 값을 할당한다.

var

console.log(foo); // undefined

var foo;
console.log(foo); // undefined

foo = 1; // 할당문에서 할당 단계가 실행된다.
console.log(foo); // 1

var 키워드로 선언된 변수는 선언 단계초기화 단계가 한번에 이루어진다.

즉, 스코프에 변수를 등록(선언 단계)하고 메모리에 변수를 위한 공간을 확보한 후, undefined로 초기화(초기화 단계)한다.

따라서 변수 선언문 이전에 변수에 접근하여도 스코프에 변수가 존재하기 때문에 에러가 발생하지 않는다.

다만 undefined를 반환한다. 이후 변수 할당문에 도달하면 비로소 값이 할당된다. 이러한 현상을 변수 호이스팅(Variable Hoisting)이라 한다.

let

let 키워드로 선언된 변수는 선언 단계초기화 단계분리되어 진행된다.

즉, 스코프에 변수를 등록(선언단계)하지만 초기화 단계는 변수 선언문에 도달했을 때 이루어진다.

초기화 이전에 변수에 접근하려고 하면 참조 에러(ReferenceError)가 발생한다. 이는 변수가 아직 초기화되지 않았기 때문이다. 다시 말하면 변수를 위한 메모리 공간이 아직 확보되지 않았기 때문이다.

따라서 스코프의 시작 지점부터 초기화 시작 지점까지는 변수를 참조할 수 없다. 스코프의 시작 지점부터 초기화 시작 지점까지의 구간을 ‘일시적 사각지대(Temporal Dead Zone; TDZ)’라고 부른다.

스코프의 선두에서 선언 단계가 실행된다.
아직 변수가 초기화(메모리 공간 확보와 undefined로 초기화)되지 않았다.
따라서 변수 선언문 이전에 변수를 참조할 수 없다.

console.log(foo); 
// ReferenceError: foo is not defined
let foo; 
// 변수 선언문에서 초기화 단계가 실행된다.
console.log(foo); 
// undefined
foo = 1; 
// 할당문에서 할당 단계가 실행된다.
console.log(foo); 
// 1

참조)
https://poiemaweb.com/es6-block-scope#13-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85

profile
start coding
post-custom-banner

0개의 댓글