12. 함수 표현식
2026년 4월 10일
자바스크립트
1. 함수 표현식의 기본 개념
함수 표현식은 함수를 생성하고 변수에 할당하는 방식입니다. 자바스크립트 엔진은 함수를 하나의 값으로 보기 때문에, 변수에 숫자를 할당하듯 함수도 할당할 수 있습니다.
// 함수 표현식 let sayHi = function() { alert("Hello"); }; // 함수는 값이기 때문에 복사도 가능합니다. let func = sayHi; func(); // Hello sayHi(); // Hello
💡 세미콜론(;)의 유무
함수 선언문 끝에는 세미콜론이 없지만, 함수 표현식 끝에는 세미콜론이 붙습니다. 이는 함수 표현식이
let 변수 = 값;이라는 구문의 일부이기 때문입니다.
2. 콜백 함수 (Callback Function)
함수를 값으로 취급하기 때문에 가능한 가장 강력한 기능 중 하나가 콜백 함수입니다. 함수를 다른 함수의 인수로 전달하고, 나중에 "호출(called back)"하도록 하는 기법입니다.
- 익명 함수(Anonymous Function): 이름 없이 선언된 함수로, 주로 콜백으로 전달될 때 일회성으로 사용됩니다.
function ask(question, yes, no) { if (confirm(question)) yes(); else no(); } // 익명 함수를 콜백으로 전달 ask( "동의하십니까?", function() { alert("동의하셨습니다."); }, function() { alert("취소하셨습니다."); } );
3. 함수 선언문 vs 함수 표현식 비교
두 방식은 동작 방식과 사용 가능한 시점에서 큰 차이를 보입니다.
| 비교 항목 | 함수 선언문 (Declaration) | 함수 표현식 (Expression) |
|---|---|---|
| 문법 | function f() { ... } | let f = function() { ... }; |
| 생성 시점 | 스크립트 실행 전 (엔진 초기화 단계) | 실행 흐름이 해당 코드에 도달했을 때 |
| 호출 시점 | 선언부보다 위에서 호출 가능 (호이스팅) | 선언 이후에만 호출 가능 |
| 스코프 | 엄격 모드 시, 선언된 블록 내에서만 유효 | 블록 밖 변수에 할당하여 블록 외부에서도 접근 가능 |
4. 블록 스코프와 조건부 함수 선언
엄격 모드(use strict)에서 함수 선언문은 자신이 선언된 블록(예: if문 안) 내부에서만 유효합니다. 블록 밖에서 함수를 사용해야 한다면 함수 표현식을 사용해야 합니다.
let age = prompt("나이를 알려주세요.", 18); let welcome; if (age < 18) { // 블록 안에서 표현식으로 할당 welcome = function() { alert("안녕!"); }; } else { welcome = function() { alert("안녕하세요!"); }; } welcome(); // 정상 동작
🎙️ 기술 면접 대비 (Interview Questions)
Q1. 함수 선언문과 함수 표현식의 '호이스팅(Hoisting)' 차이를 설명해 주세요. (중급)
답변: 자바스크립트 엔진은 스크립트 실행 전 초기화 단계에서 모든 함수 선언문을 찾아 먼저 생성합니다. 따라서 선언 전에도 호출이 가능합니다. 반면 함수 표현식은 실행 흐름이 해당 줄에 도달했을 때 함수가 생성되므로, 선언 이전에는 접근하거나 호출할 수 없습니다.
Q2. 어떤 상황에서 함수 표현식을 사용하는 것이 더 유리한가요? (중급)
답변: 주로 두 가지 상황입니다. 첫째, 조건에 따라 함수를 다르게 정의해야 하고 그 함수를 블록 밖에서도 사용해야 할 때입니다. 둘째, 함수를 다른 함수의 인수로 전달하는 '콜백 함수'를 익명 함수 형태로 간결하게 작성할 때 매우 유리합니다.