피드백 및 오류 수정은 항상 환영합니다. 꼭 이상하거나 잘못되어져 있는 내용들에 대해서는 딴지를 걸어주세요!🐶
인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것
함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것(사실 실제로 코드의 위치가 위로 옮겨지는 것은 아니다.)
declaration과 initialization이 동시에 일어난다. 고로 변수를 선언전에 접근하여도 undefined가 뜬다.
declaration phase와 initialization phase가 따로 일어나고, TDZ는 그 사이 시간, 즉 스코프의 시작 지점에서 초기화 시작 지점까지 구간을 말한다. Initialization phase는 변수 선언문에 도달해야 이뤄진다.
단지 Creation Phase에서 var로 선언한 변수들은 undefined로 초기화되는 것과 달리, let과 const로 선언하면 uninitialized 상태로 남는다. 그리고 initialized되기 전에 접근하려고 하면 오류를 나타낸다.
let foo = 1; // 전역 변수
{
console.log(foo); // ReferenceError: foo is not defined
let foo = 2; // 지역 변수
}
hoisting이 아예 안일어난다면, Scope chain에 의해 전역 변수인 foo에 할당된 1이 출력되야 하지만, let으로 선언된 foo는 블럭 스코프안에서 hoisting이 되고 변수 선언문을 만나기전까지 TDZ에 빠져서 오류를 출력한다.
{
let i = 3;
}
console.log(i); // error
let과 const는 TDZ에 의해 제약을 받는다.
Temporal Dead Zone : 스코프 시작지점(declaration phase)부터 initialization phase까지
let으로 선언한 변수를 선언할 때 초기값을 안 주면 undefined로 할당된다.
let과 const의 차이점은 값을 재할당가능한지 여부이다.
함수 선언식에서는 declaration, initialization, assignment phase가 동시에 일어난다. 이 말은 함수의 해당 scope가 시작되자마자부터 함수에 정상적으로 접근이 가능하다는 것이다. 하지만 함수 표현식은 어떨까?
sayWow();
sayYeah(); // 할당되기 전에 호출되서 error
var sayYeah = function() { // var로 선언되었으니깐 선언됨과 동시에 undefined로 할당됨
console.log('yeah');
}
function sayWow() { // 선언과 동시에 초기화, 할당까지
console.log('wow');
}
// wow
// error
Global execution context에서 sayYeah 변수는 var로 선언되었으므로 스코프 시작과 함께 undefined로 초기화된다. sayWow 함수는 컨텍스트 생성과 동시에 할당된다.
sayYeah는 대입되기전에 호출되므로 에러가 발생한다.
고로 함수 표현식에서 함수가 할당된 변수는 정상적으로 hoisting되지만, 해당 함수가 할당되기전에 접근하려고 하면 오류가 난다.