
❓ 호이스팅이란?
java script 에서 호이스팅이란 인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것을 의미한다.
주로 호이스팅은 선언부를 함수 번위의 최상단으로 끌어올리는 현상이라 말한다.
✔ 변수의 생성 3단계
1. 선언 단계
변수를 실행 컨텍스트의 변수 객체에 등록한다. 이 변수 객체는 스코프가 참조하는 대상이 된다.
초기화 단계
변수 객체에 등록된 변수를 위한 공간을 메모리에 확보한다. 이 단계에서 변수는 undefined로 초기화된다.할당 단계
undefined로 초기화된 변수에 실제 값을 할당한다.
위와 같이 var 키워드의 단점을 보완하기 위해 ES6에서는 새로운 변수 선언 키워드인 let과 const를 도입했다.
위에서 설명했듯, var 키워드로 선언된 변수는 선언 단계와 초기화 단계가 한번에 이루어진다.
// var 키워드로 선언한 변수는 런타임 이전에 선언 단계와 초기화 단계가 실행된다.
// 따라서 변수 선언문 이전에 변수를 참조할 수 있다.
console.log(foo); // undefined
var foo;
console.log(foo); // undefined
foo = 1; // 할당문에서 할당 단계가 실행된다.
console.log(foo); // 1

let과 const 키워드로 선언된 변수는 선언 단계와 초기화 단계가 분리되어 진행된다.
// 런타임 이전에 선언단계가 실행된다. 아직 변수가 초기화 되지 않았다.
// 초기화 이전의 일시적 사각지대에서는 변수를 참조할 수 없다.
console.log(ex); // ReferenceError: foo is not defined
let ex; // 변수 선언문에서 초기화 단계가 실행된다.
console.log(ex); // undefined
ex = 1; // 할당문에서 할당 단계가 실행된다.
console.log(ex); // 1
