참고한 페이지
MDN Hoisting
인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것을 의미합니다.
초기화는 호이스팅 대상이 아닙니다. 선언이 없으면, 호이스팅은 일어나지 않죠.
console.log(num); // 호이스팅 X, ReferenceError
num = 5; // 초기화, 호이스팅 대상 아님
다음 예제를 보면 var 변수는 호이스팅 시 undefined로 초기화된다는 것을 알 수 있습니다.
console.log(num); // 호이스팅, undefined 출력
var num; // 선언, 호이스팅 대상
num = 5; // 초기화, 호이스팅 대상 아님
역시 호이스팅 대상입니다. var와 다른 점은 undefined로 변수를 초기화하지 않는다는 겁니다. 따라서 초기화 수행 전 접근시 에러가 발생합니다.
console.log(name); // ReferenceError
let name = 'Jason';
함수는 어떨까요?
역시 호이스팅 대상입니다. 호이스팅 덕분에 선언보다 먼저 호출이 가능합니다.
hello('Jason');
function hello(name) {
console.log(`Hello, ${name}!`);
}
앞서 let, const는 호이스팅 대상이지만 초기화 전에 접근시 에러가 난다고 했는데요. 이는 TDZ(Temporal Dead Zone)의 영향을 받기 때문입니다. TDZ는 다음 포스팅에서 계속 이어가겠습니다.