#1
var tmp; // 변수 선언
var키워드에만 있는 특별함이 있다.
var을 사용한 변수 선언은 유일하게 선언과 초기화가 동시에 이루어진다. 반면 let이랑 const로 변수를 선언하면 별도의 초기화는 되지 않는다. 생각해보면 let이랑 const가 정상이다. 할당문이 존재하지 않는데 선언만 했다고 변수가 undefined로 초기화되는게 이상하기 때문이다.
호이스팅은 위와 같은 var키워드로 변수를 선언했을 때 생기는 현상을 말하는데, 아래에서 자세히 알아보자.
#2
console.log(tmp); // undefined
var tmp; // 변수 선언
위의 코드를 실행해보면 참조에러가 발생할 거 같지만 실제로는 에러가 발생하지 않는다. 위에서 언급했듯이 var키워드로 선언한 변수 tmp에는 별도의 값이 할당 되기 전에도 undefined로 초기화 되기 때문이다.
이러한 현상이 발생하는 이유는 var선언문이 코드가 한줄씩 실행되는 런타임에서가 아니라, 그 이전 단계 ( 코드 평가 과정이라고 부른다 ) 에서 사전 실행을 한다고 한다.
그리고 런타임에서 나머지 코드(할당문)들을 실행하기 때문에 위의 코드에서는 참조 오류가 뜨지 않고, 변수에 undefined값이 할당되어 정상적으로 출력되는 것 이다.
#2-1 // #2의 실행 순서를 나타내는 코드
var tmp; // 변수 선언
console.log(tmp); // undefined
이처럼 변수 선언문이 전체 코드의 맨 앞으로 올라간 것처럼 동작하는 현상을 호이스팅이라 한다.
사실 명시적으로는 var, let, const, func, func*, class키워드를 사용한 모든 선언문이 호이스팅 된다. 모든 선언문은 런타임이전에 실행되기 때문에 호이스팅은 선언문이 존재하는 이상 항상 발생한다.
추가로 var과 같이 예외적으로 런타임이전에 초기화가 되는 것은 함수의 선언문이 있다. 이 둘을 제외한 나머지 키워드들은 호이스팅은 되지만 런타임이전에 초기화는 되지 않는다.
함수의 선언문은 함수 파트에서 다뤄볼 예정이다.