호이스팅(Hoisting)?
JavaScript 엔진이 코드를 실행하기 전에 함수안에 변수 및 함수 선언을 최상단으로 끌어 올리는 것을 말함
실제 코드를 끌어 올리는 것은 아니고 사용하고자하는 변수 및 함수를 미리 선언만 하는것
변수를 해당 스코프의 최상단으로 끌어올리는 현상이며, 선언만 할뿐 할당되지 않는다.
함수 선언을 스코프의 최상단으로 끌어올리는 현상으로 함수 선언문과 함수 표현식이 다르게 동작한다.
이처럼 함수 선언문의 경우 호이스팅 과정에서 함수 자체가 메모리에 올라가지만 함수 표현식에서는
변수를 먼저 선언하고 할당하는 방식으로 호이스팅이 일어난다.
let과 const도 호이스팅이 일어난다.
하지만 위의 var대신 let과 const를 사용하면 정의되지 않았다는 오류가 발생한다.
왜그럴까 ??
이유는 자바스크립트에서 변수를 처리할때 크게 3단계에 거쳐 처리를 한다.
1.선언
----변수를 생성하고 변수를 등록
2.초기화
----등록된 변수를 undefined로 초기화
3.할당
----undefined로 초기화된 변수에 실제값을 할당
var의 경우 호이스팅 과정에서 선언과 초기화가 함께 일어나지만 let과 const의 경우 호이스팅 과정에서 선언 단계만 이루어지기 때문이다.