함수가 다른 함수의 입력값으로 들어가서 그 함수가 원할 때 호출할 수 있다.
const val = function(){ console.log("callback");}
const fn = function (arg){
arg();
}
fn(val); // 출력 : callback
함수 선언문은 호이스팅에 의해 선언문 전체가 위로 끌어올려진다.
자바스크립트 엔진이 코드 실행 전에 이미 함수를 알고 있다.
그래서 같은 블록 내에서라면 어디서든지 함수를 호출할 수 있다.
fnDeclaration();
function fnDeclaration(){
console.log('함수 선언문');
}
// 출력 : '함수 선언문'
함수 표현식은 변수에 함수를 할당하는 방식이다.
하지만 함수 표현식은 함수를 할당하는 변수만 호이스팅되기 때문에
표현식 코드 아래에서 호출을 해야한다.
const fnExpresssion = function(){
console.log('함수 표현식');
}
fnExpression(); //출력 : 함수 표현식
만약 위에서 호출을 하면?
fnExpression();
const fnExpresssion = function(){
console.log('함수 표현식');
}
// 출력 : fnExpression is not defined;
변수에 함수가 할당되지 않아서 undefined가 뜬다.
선언문을 사용하면 함수가 덮어씌워질 위험이 있다. 이미 선언한 함수와 같은 이름으로 다시 선언하면 가장 나중에 선언한 함수의 코드로 바뀌게 된다.
표현식은 코드의 실행 흐름에 따라 함수가 선언된 이후에만 호출될 수 있다.
책 '혼자 공부하는 자바스크립트'에서는 안전하게 사용할 수 있는 함수 표현식으로 통일해서 사용할 것을 권장하고 있다.