함수의 선언이 호이스팅되지 않게 하고, 함수의 이름을 명시하기 위해 함수 표현식-기명 함수를 사용하라는 Airbnb 가이드를 확인했다.
함수 선언식
과 표현식
의 차이, 호이스팅
, 화살표 함수
에 대해 간단히 알아보았다.
JavaScript의 모든 함수는 Fucntion 객체
이다.
function
키워드를 사용하여 함수를 정의한다.
함수 선언식은 호이스팅
되어, 함수를 정의하기 전에 참조할 수 있다. 이것은 가독성과 유지관리성을 해친다.
function sayHello(name) {
console.log(`Hello, ${name}!`);
}
console.log(sayHello.name) // sayHello
JavaScript에서
호이스팅(hoisting)
이란, 인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것을 의미합니다.
var로 선언한 변수의 경우 호이스팅 시 undefined로 변수를 초기화합니다.
반면 let과 const로 선언한 변수의 경우 호이스팅 시 변수를 초기화하지 않습니다. - MDN
함수의 선언을 변수
에 할당하고, 변수를 호출하여 함수를 사용할 수 있다.
함수의 이름을 명시하느냐에 따라 기명 함수/익명 함수로 나눈다.
함수 표현식은 변수만 호이스팅 되고, 함수 선언은 초기화 되지 않는다.
따라서 함수를 정의하기 전에 참조할 수 없다.
함수 표현식에서 함수의 이름을 지정하면, 함수 내에서 자신을 참조하거나 디버거 내 스택 추적에서 함수를 식별할 수 있다.
const sayHello = function hello(name) {
console.log(`Hello, ${name}!`);
};
console.log(sayHello.name) // hello
hello('Amy'); // hello is not defined -> 함수명은 외부에서 호출할 수 없다.
콜백함수(이벤트 핸들러)에 주로 쓰인다.
const sayHello = function (name) {
console.log(`Hello, ${name}!`);
};
console.log(sayHello.name) // sayHello
화살표 함수를 사용해도 두 가지 조건(함수의 선언이 호이스팅되지 않고, 함수의 이름을 명시)을 만족시킬 수 있다.
sayHello('Amy'); // Cannot access 'sayHello' before initialization
const sayHello = (name) => {
console.log(`Hello, ${name}!`);
}
console.log(sayHello.name) // sayHello