
자바스크립트(타입스크립트) 코드를 짜다가 함수가 선언되기도 전에 호출해도 코드가 정상작동 되는 것에 대해 의문을 품게 되었는데, 이것이 자바스크립트의 호이스팅이라는 특성 때문인 것을 알게 되었다.
function functionName() {}이다.console.log(funcDeclaration()); // "Hello from Function Declaration"
function funcDeclaration() {
return "Hello from Function Declaration";
}
const functionName = function() {};이다. 함수 표현식에는 익명 함수와 기명 함수 둘 다 사용할 수 있다.console.log(funcExpression()); // TypeError: funcExpression is not a function
var funcExpression = function() {
return "Hello from Function Expression";
};
var로 선언된 변수는 호이스팅될 때 undefined로 초기화된다.console.log(a); // 출력: undefined
var a = 10;let과 const로 선언된 변수도 호이스팅 된다.
그러나 let과 const로 선언된 변수는 호이스팅 된 후 초기화되지 않는다.
선언 전에 변수에 접근하면 "일시적 사각지대(Temporal Dead Zone, TDZ)"에 들어가게 되며, 이 때문에 에러가 발생한다.
console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 20;
console.log(c); // ReferenceError: Cannot access 'c' before initialization
const c = 30;
위의 내용은 let, const, 그리고 var와 호이스팅의 관계를 나타내는 내용이다. let과 const는 호이스팅되긴 하지만, 초기화되지 않는 특징을 가지며, 이로 인해 선언 전에 접근하려고 하면 에러가 발생한다.
함수 표현식도 호이스팅에 영향을 받는다.
하지만 함수 표현식을 사용하면 변수는 호이스팅되어 undefined로 초기화되지만, 함수 자체는 호이스팅되지 않는다.
예를 들어,
console.log(funcExpression); // 출력 결과는 undefined다.
console.log(funcExpression()); // 에러가 발생하며, "funcExpression is not a function"이라는 메시지가 나온다.
var funcExpression = function() {
return "Function Expression에서 반환하는 메시지";
};
console.log(funcExpression()); // 이제는 "Function Expression에서 반환하는 메시지"라고 출력된다.
위 예시에서 funcExpression 변수는 호이스팅되기 때문에 처음에 undefined로 평가된다. 그리고 아직 함수가 할당되지 않았기 때문에 호출하려고 하면 에러가 발생한다.
따라서 함수 표현식을 사용할 때는 함수 호출 전에 반드시 함수가 할당되어 있어야 한다.