코드 실행 전 실행 컨텍스트를 위해 변수 선언/함수 선언이 메모리 공간에 할당되는 것.
자바스크립트 엔진은 코드를 실행하기 전에 실행 가능한 코드를 형상화하고 구분하는 과정(실행컨텍스트를 위한 과정)을 거친다.
그 과정에서 모든 선언(변수, 함수선언 포함)을 메모리에 저장한다.
그래서 코드 실행 전 이미 변수 선언/함수 선언이 메모리에 저장되어 있기 때문에 선언문보다 참조/호출이 먼저 나와도 오류 없이 동작한다.
자바스크립트의 모든 선언은 호이스팅이 일어난다.
하지만 let,const,class 를 이용한 선언문은 호이스팅이 발생하지 않는 것처럼 동작한다.
var 키워드는 선언과 함께 undefined로 초기화되어 메모리에 저장되는데(선언 단계 초기화 단계 동시)
let,const는 초기화되지 않은 상태로 저장되기 때문.(선언 단계와 초기화 단계가 분리되어 진행)
그래서 let,const에도 호이스팅이 일어나기 때문에 에러를 일으키는 것이다.
함수는 전체 함수에 대한 참조가 함께 저장된다.
함수 표현식은 선언과 할당이 분리된다. 위의 var, let,const 키워드의 특성에 따라 진행된다.
그런데 var은 undefined로 처음에 할당되기 때문에 typeError, 다른 키워드는 referenceError가 발생한다.
같은 이름의 var변수 선언과 함수 선언에서의 호이스팅은 변수 선언이 함수 선언보다 위로 끌어올려진다.
코드 실행 전 실행 컨텍스트를 위해 변수 선언/함수 선언이 메모리 공간에 할당되는데, 그렇기 때문에 선언문보다 참조/호출이 먼저 나와도 오류 없이 동작한다.
하지만 let,const,class는 초기화되지 않은 상태로 저장되기 때문에 이러한 상황에서 에러가 발생한다.
https://developer.mozilla.org/ko/docs/Glossary/Hoisting
https://gmlwjd9405.github.io/2019/04/22/javascript-hoisting.html