함수 표현식과 선언문의 차이에 대해 알아봅시다.
첫번째 차이는 문법.
function sum(a, b) {
return a + b;
}
=
을 이용해 만든 할달 표현식 우측에 생성 (등호= 가 사용되었으니 식이 된다는 듯?)let sum = function(a, b) {
return a + b;
}
두번째 차이는 자바스크립트 엔진이 언제 함수를 생성하는지다.
함수 표현식은 실제 실행 흐름이 해당 함수에 도달했을때 함수를 생성한다. 따라서 실행 흐름이 함수에 도달했을 때부터 해당 함수를 사용할 수 있다.
위 예시로 보면 스크립트가 실행되고, 실행 흐름이 let sum = function...
에 도달했을때 함수가 생성이되고, 이 이 후부터 함수를 사용할 수 있다.
하지만 함수 선언문은 함수 선언문이 정의되기 이전에도 호출할 수 있다.
따라서 전역 함수 선언문은 스크립트 어디에 있느냐에 상관없이 어디서든 사용할 수 있다.
이게 가능한 이유는 자바스크립트의 내부 알고리즘 때문인데, 자바스크립튼느 스크립트를 실행하기 전, 준비단계에서 전역에 선언된 함수 선언문을 찾고 → 해당 함수를 생성한다.
즉 스크립트가 진짜 실행되기 전 "초기화 단계"에서 함수 선언 방식으로 정의한 함수가 생성된다는 것. (이게 호이스팅인가 뭔가하는 그건가?)
스크립트는 함수 선언문이 모두 처리된 이후에서야 실행되기때문에, 스크립트 어디서든 함수 선언문으로 선언한 함수에 접근할 수 있다.
ℹ️ 함수 선언문과 함수 표현식 중 무엇을 선택해야 하나?
함수 선언문으로 함수를 정의하면, 함수가 선언되기 전에 호출할 수 있어서 코드 구성을 좀 더 자유롭게 할 수 있다.
또, 함수 선언문을 사용하면 가독성도 좋아지는데let f = function(...) {...}
보다function f(...) {...}
을 찾는게 더 쉽고 더 눈길을 사로잡는다.
그러나 어떤 이유로 함수 선언 방식이 적합하지 않다면 함수 표현식을 사용해야 한다.