함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것이다.
자바스크립트 함수는 실행되기 전에 함수 안에 필요한 변수 값들을 모두 모아서 유효 범위의 최상단에 선언한다.
유효범위: 함수 블록 { } 안에서 유효
즉 함수 내에서 아래 쪽에 존재하는 내용 중 필요한 값들을 끌어올리는 것이다.
하지만 실제로 코드가 끌어올려지는 것은 아니고, 자바스크립트 parser가 내부적으로 끌어올려서 처리하는 것으로 실제로 메모리에는 변화가 없다.
호이스팅은 var변수 선언과 함수 선언문에서만 일어난다.
var는 선언과 초기화가 이뤄진 후 할당이 일어난다.
이때 선언만 위로 끌어올려지며, 할당은 끌어올려지지 않는다.
따라서 할당이 일어나기 전에 변수를 참조하면 항상 undefined가 된다.
런타임 이전에 자바스크립트 엔진에 의해 선언 단계가 먼저 실행된다. 이후 초기화 단계가 실행되지 않았을 때 접근 시 참조에러가 발생한다. (TDZ)
일시적 사각지대( TDZ: Temporal Dead Zone ): 스코프의 시작지점(선언단계)부터 초기화 단계 시작 지점까지 일시적으로 참조할 수 없다.
변수 중복 선언이 불가능하다. (재할당은 가능)
선언 단계와 초기화 단계가 분리되어 진행된다.
변수 중복 선언이 불가능하며 반드시 선언과 초기화를 동시에 진행해야 한다. 런타임 이전에는 실행될 수 없다.
재선언, 재할당 x (재할당의 경우 객체로는 가능) 재할당을 금지할 뿐 불변은 x
호이스팅이 발생하긴 하지만 스코프에 진입할 때 변수가 만들어지고 TDZ가 생성되어 코드 실행이 변수가 실제 있는 위치에 도착할때까지 접근을 할 수 없다.
function foo() { // 함수선언문(호이스팅 o)
console.log("hello");
}
var foo2 = function() { // 함수표현식(호이스팅 x)
console.log("hello2");
}
var foo3 = new Function(console.log("hello"));
var foo4 = () => console.log("bar");
ES6를 어디서든 쓸 수 있으려면 아직 시간이 필요하므로 ES5로 트랜스 컴파일을 해야한다. 아직은 var가 어떻게 동작하는지 알아야한다.