변수와 함수의 선언부가 위치한 인접 스코프의 시작 지점에서 해당 식별자를 관측할 수 있는 현상이고 호이스팅은 크게 함수 호이스팅과 변수 호이스팅으로 나뉜다.
함수의 호이스팅이 다른 무엇보다 먼저 이뤄지고, 함수의 호이스팅은 선언문에만 해당하지만 표현식도 결국 어떠한 변수로 함수를 할당하는것과 같은 사례로 볼 수 있다.
호이스팅이 발생하면 선언과 초기화가 거의 동시에 이뤄지고, 실행 시점에서 스코프 최상단에 메모리가 있기 때문에 선언 위치와 관계 없이 참조, 할당이 가능한 것이다.
호이스팅이 발생하면 선언만 이뤄지고 실행 시점에서 해당 변수에 대한 메모리가 존재하지 않기 때문에 선언 위치보다 상단에서 참조, 할당이 불가능한 것이다.
💡 TDZ(Temporal Dead Zone)시점에서 변수는 선언되었지만 초기화가 되지 않은 상태이기 때문에 호이스팅의 범주에 들어갈 수 있다 없다라는 의견이 분분하다.
hoist(); // hoisted!
function hoist() {
console.log('hoisted!');
}
console.log(text); // undefined
var text;
console.log(text); // ReferenceError: Cannot access 'text' before initialization
let text;
console.log(text)
const text = "text"; // ReferenceError: Cannot access 'text' before initialization
const text; // SyntaxError: Missing initializer in const declaration
TDZ 이슈도 있고, 코드의 가독성과 유지보수를 위해 선언한 곳 아래에서 사용하자!