변수나 함수 선언을 코드의 최상단으로 끌어올리는 것처럼 동작하는 특성
즉, 나중에 선언된 변수를 참조할 수 있다는 것
➜ 자바스크립트 엔진이 코드를 실행하기 전에 변수와 함수 선언을 메모리에 저장하기 때문에, 선언이 어디에 있던 변수나 함수를 참조할 수 있게 되는 것(호이스팅)!
변수 호이스팅은 var, let, const 키워드를 사용할 때 각각 다르게 동작한다.
var로 선언된 변수는 호이스팅되어 에러가 일어나지 않고, undefined 로 초기화된다.
console.log(x); // undefined
var x = 5;
console.log(x); // 5
ECMAScript 2015의 let과 const는 변수를 블록의 상단으로 끌어올리지만 초기화하지 않는다. 변수가 선언되기 전에 블록 안에서 변수를 참조하게 되면 ReferenceError를 발생시킨다.
console.log(y); // ReferenceError: y is not defined
let y = 5;
함수에서는
함수 선언으로는 호이스팅되지만,함수 표현식으로는 호이스팅 되지 않는다. (함수 표현식은 변수 호이스팅의 규칙을 따르기 때문)
/* 함수 선언 */
foo(); // "bar"
function foo() {
console.log("bar");
}
/* 함수 표현식 */
baz(); // TypeError: baz is not a function
var baz = function () {
console.log("bar2");
};
호이스팅으로 인한 혼란을 피하기 위해서는 변수 선언은 코드의 최상단에서, 함수 선언은 가능한 사용하기 전에 하는 것이 좋다.
또한, 호이스팅으로 인한 혼란을 최소화하기위해 var 대신 let이나 const를 사용하여 변수를 선언하는 것이 현대 자바스크립트 개발에서 권장되는 방식이다.
코드의 동작을 예측 가능하게 하고, 버그를 방지하기 위해 호이스팅의 동작 방식을 이해하고 적절히 대응하는 것이 중요하다. 이를 통해 더 깔끔하고 효율적인 코드를 작성할 수 있다.
호이스팅은 변수나 함수 선언을 코드의 최상단으로 끌어올리는 것처럼 동작하는 특성을 말합니다. 즉, 나중에 선언된 변수를 참조할 수 있다는 것을 뜻합니다. 이는 자바스크립트 엔진이 런타임을 실행하기 전에, 선언문을 먼저 찾아낸 후 소스코드를 실행시키기 때문입니다. 참고로 var로 선언된 변수는 에러없이 호이스팅되어 undefined로 초기화되지만, let, const로 선언된 변수는 초기화되지않아 참조에러가 발생합니다. 또한 함수 선언식은 호이스팅 되지만, 함수 표현식은 호이스팅 되지않아 TypeError가 발생합니다.
자바스크립트의 호이스팅(Hoisting)이해하기
MDN 호이스팅
모던자바스크립트 Deep Dive 내용 정리 - 04장 변수