함수 안에 있는 선언들을 끌어올려서 해당 함수
유효 범위의 최상단
에 선언하는 것을 말합니다.
자바스크립트 함수는 실행되기 전에 함수 안에 필요한 변수값들을 모아서 유효 범위의 최상단에 선언합니다.
{}
안에서 유효함수 내에서 아래 쪽에 존재하는 내용 중 필요한 값들을 끌어 올리는 것입니다.
모든 선언
에는 호이스팅이 일어납니다.ex)
function printName(firstname){ //함수 선언문
var result = inner();
console.log(typeof inner);
console.log("name is" + result);
function inner(){ //함수 선언문
return "inner value";
};
};
printName(); //함수 호출
위 예제에서는 함수선언문이 아래에 있어도 printName 함수 내에서 inner를 function으로 인식하기 때문에 오류가 발생하지 않습니다.
1. 함수 표현식의 선언이 호출보다 위에 있는 경우(정상 출력)
ex)
function printName(firstname){ //함수 선언문
var inner = function(){ //함수 표현식
return "inner value";
}
var result = inner(); //함수 호출
console.log("name is" + result);
}
printName();
2. 함수 표현식의 선언이 호출보다 아래에 있는 경우 - var 변수에 할당(Type Error)
ex)
function printName(firstname){ //함수 선언문
console.log(inner);
var result = inner(); //함수 호출
console.log("name is" + result);
var inner = function(){ //함수 표현식
return "inner value";
};
};
printName();
3. 함수 표현식의 선언이 호출보다 아래에 있는 경우 - const/let 변수에 할당(ReferenceError)
ex)
function printName(firstname){ //함수 선언문
console.log(inner);
let result = inner(); //함수 호출
console.log("name is" + result);
let inner = function(){ //함수 표현식
return "inner value";
};
};
printName();
함수 표현식 보다 함수 선언문을 더 자주 사용하지만, 어떤 코딩 컨벤셩에서는 함수 표현식을 권장하기도 합니다.