함수 선언형
- 호이스팅 : 함수 선언형은 호이스팅됩니다. 함수를 선언하기 전 호출이 가능
- 구문 : function functionName() {...} 형태로 선언
- 스코프 : 함수 또는 전역 스코프에 정의
helloWorld();
function helloWorld() {
console.log('헬로월드');
}
함수 표현식
- 호이스팅 되지 않음 : 변수의 호이스팅 규칙을 따름, 함수 자체는 호이스팅 되지 않아 선언 전에 호출할 수가 없음
- 구문 : var 또는 let, const functionName = function() {}
- 익명 또는 명명된 함수 : 함수 표현식은 익명 함수로 사용될 수도 있고 이름을 가진 함수로 사용될 수도 있습니다.
- 스코프 : 변수가 선언된 스코프에 종속
helloWorld();
var helloWorld = function() {
console.log('Hello World!');
};
helloWorld();
주요 차이점
| 함수 선언형 | 함수 표현식 |
|---|
| 호이스팅 | 호이스팅되어 선언 전에 호출이 가능 | 호이스팅 되지 않아 선언 전에 호출 불가능 |
| 익명성 | 불가능 | 익명으로 사용 가능 |
| 사용 시나리오 | 전역 함수나 재사용 가능한 함수를 정의할 때 주로 사용 | 콜백, 이벤트 핸들러 IIFE 등의 경우에 자주 사용 |
함수의 익명성
- 함수가 이름을 가지지 않는다는 것을 의미, 이름이 지정되지 않으므로 함수 내부에서 자기 자신을 참조할 수 없음
- 함수 표현식의 형태로 사용
- 즉시 실행 함수 표현(IIFE)에서 자주 사용
- IIFE : 정의되자마자 실행되는 함수
- 이벤트 핸들러, 타이머 함수('setTimeout', setInterval'), Promise의 .then(), .catch() 등에서 콜백 함수로서 널리 사용
let myFunction = function() {
console.log('Hello World!');
};
(function() {
console.log('This is IIFE!');
})();
setTimeout(function() {
console.log('Executed after 1 second');
}, 1000);
명명된 함수 vs 익명 함수
- 명명된 함수(Named Function)는 함수 이름을 가지며 재귀 호출이나 디버깅에 유용
- 익명 함수(Anonymous Function)는 이름이 없어 특정 상황(콜백 등)에서 코드를 간결하게 유지하는 데 유용
- 특정 상황에서 코드의 간결성을 높이고 즉시 실행이나 일회성 콜백 함수를 작성하는 데 효과적임
- 재사용 가능하거나 재귀적인 함수를 작성할 때는 명명된 함수를 사용하는 것이 적합