자바스크립트 엔진은 코드를 실행하기 전 '컴파일 단계'를 거치며 변수 선언을 메모리에 미리 등록합니다.
실제 코드 위치와 상관없이 선언부만 최상단으로 끌어올려진 것처럼 보이는 현상을 말합니다.
호이스팅은 모든 변수(var, let, const)에 발생하지만, 그 결과는 확연히 다릅니다.
= 초기화 전 접근 금지 구간
= 스코프의 시작 지점부터 초기화 시작 지점까지 변수를 참조할 수 없는 구간
console.log(a) // undefined
var a = 10
----- 동작과정 -----
var a
console.log(a) // undefined
a = 10
console.log(b) // ReferenceError(TDZ 발생)
let b = 10
sayHello() // 정상 실행
function sayHello() {
console.log(""hello"")
}
//→ 함수 전체가 호이스팅됨.
sayHi() // TypeError
var sayHi = function () {
console.log(""hi"")
}
//→ 변수는 undefined로 호이스팅
//→ 함수는 아직 할당 안 됨.