자바스크립트에서 호이스팅(Hoisting)은 코드 실행 전에 변수 및 함수 선언을 메모리에 “끌어올리는” 현상을 의미합니다.
이러한 동작은 개발자가 변수 및 함수 선언을 코드의 어디에 작성하든지, 해당 선언들이 스코프의 최상단으로 끌어올려진다는 의미입니다. 하지만, 실제로 변수의 할당은 그 위치에 따라 결정됩니다.
변수 호이스팅(Variable Hoisting)
console.log(name); // undefined
var name = "John";
위의 예제에서 console.log(name)
은 변수 name
을 선언하기 전에 호출됩니다. 하지만 자바스크립트에서는 변수 선언이 최상단으로 끌어올려지기 때문에 에러가 발생하지 않고 undefined
가 출력됩니다.
아래는 자바스크립트 엔진이 실제로 코드를 해석하는 방법입니다.
var name; // 변수 선언이 호이스팅 됨
console.log(name); // undefined
name = "John";
결과적으로 변수는 선언부가 호이스팅되지만, 정의(할당)는 그 위치에 따라 이루어집니다.
함수 호이스팅(Function Hoisting)
greet(); // "Hello!"
function greet() {
console.log("Hello!");
}
위의 예제에서 함수 greet()
은 호출(greet()
)되기 전에 정의되었습니다. 이는 자바스크립트에서 함수 선언이 호이스팅되기 때문에 가능한 동작입니다.
아래는 자바스크립트 엔진이 실제로 코드를 해석하는 방법입니다.
function greet() {
console.log("Hello!");
}
greet(); // "Hello!"
따라서 함수 선언문은 호이스팅에 의해 스코프의 최상단으로 이동되며, 이후에 어디에서든지 호출할 수 있습니다.
호이스팅 주의사항
변수와 함수 선언문만 호이스팅 됨
호이스팅은 변수와 함수 선언문에만 적용됩니다. 변수 할당과 함수 표현식에는 호이스팅이 적용되지 않으므로 주의해야 합니다.
console.log(x); // ReferenceError: x is not defined
let x = 10;
위의 예제에서 let
키워드로 선언된 변수 x
는 호이스팅되지 않습니다. 따라서 변수를 선언하기 전에 호출하면 ReferenceError
가 발생합니다.
최상단에 선언하지 않아도 호이스팅 됨
변수와 함수 선언문은 스코프 내에서 어디서든지 호이스팅됩니다. 따라서 최상단에 선언하지 않아도 호이스팅되는 동작을 주의해야 합니다.
function foo() {
console.log("Hello from foo!");
}
function bar() {
console.log("Hello from bar!");
}
foo(); // "Hello from foo!"
bar(); // "Hello from bar!"
var foo = function() {
console.log("Hello from foo!");
};
var bar = function() {
console.log("Hello from bar!");
};
위의 예제에서 함수 선언문은 호이스팅되어 어디서든지 호출할 수 있으므로, 변수 할당문 이전에 호출해도 정상적으로 동작합니다. 하지만 함수 표현식은 호이스팅되지 않으므로 변수 할당문 이전에 호출하면 TypeError
가 발생합니다.
결론
자바스크립트의 호이스팅은 개발자들이 변수와 함수를 선언하는 위치에 제한을 두지 않는 장점을 가지고 있습니다. 하지만 호이스팅 동작을 이해하지 못하면 예기치 않은 결과를 초래할 수 있으므로, 항상 정확히 이해하고 사용해야 합니다.
자바스크립트 호이스팅은 초보 개발자들에게 혼란을 줄 수 있으며, 가독성과 유지보수성을 저하시킬 수도 있습니다. 따라서 변수와 함수를 선언한 후에 사용하는 습관을 들이는 것이 좋습니다.