자바스크립트 함수 선언문과 표현식의 차이점 이해하기
F-Lab : 상위 1% 개발자들의 멘토링
AI가 제공하는 얕고 넓은 지식을 위한 짤막한 글입니다!

자바스크립트 함수 선언문과 표현식의 차이점
자바스크립트에서 함수는 두 가지 주요 방식으로 정의될 수 있습니다: 함수 선언문과 함수 표현식입니다. 이 두 가지 방식은 코드 작성 스타일뿐만 아니라 동작 방식에서도 차이가 있습니다.
함수 선언문은 'function 함수이름() { }' 형태로 작성되며, 코드가 실행되기 전에 호이스팅(hoisting)되어 사용할 수 있습니다. 반면, 함수 표현식은 'const 변수명 = function() { }' 형태로 작성되며, 선언된 이후에만 사용할 수 있습니다.
왜냐하면 함수 선언문은 자바스크립트 엔진이 실행 전에 메모리에 로드하기 때문에 코드 어디에서든 호출이 가능하기 때문입니다. 반면, 함수 표현식은 변수에 할당된 이후에만 호출이 가능하기 때문입니다.
이러한 차이는 코드 작성 시 유연성과 안전성에 영향을 미칩니다. 특히, 함수 표현식은 블록 스코프 내에서만 유효하기 때문에 코드의 가독성과 유지보수성을 높이는 데 유리합니다.
따라서, 함수 선언문과 표현식의 차이를 이해하고 상황에 맞게 사용하는 것이 중요합니다.
호이스팅과 함수 선언 방식
호이스팅은 자바스크립트의 중요한 개념 중 하나로, 변수와 함수 선언이 코드의 최상단으로 끌어올려지는 현상을 말합니다. 함수 선언문은 호이스팅이 적용되어 코드 어디에서든 호출이 가능합니다.
예를 들어, 다음 코드를 보겠습니다:
console.log(add(2, 3)); // 5
function add(a, b) {
return a + b;
}
위 코드에서 함수 선언문은 코드 실행 전에 메모리에 로드되므로, 함수 호출이 선언문보다 앞에 있어도 문제가 없습니다.
반면, 함수 표현식은 다음과 같이 동작합니다:
console.log(add(2, 3)); // ReferenceError
const add = function(a, b) {
return a + b;
};
왜냐하면 함수 표현식은 변수에 할당된 이후에만 호출이 가능하기 때문입니다. 따라서, 함수 표현식을 사용할 때는 선언 순서를 신경 써야 합니다.
이러한 차이는 코드 작성 시 함수 호출 순서와 관련된 버그를 방지하는 데 중요한 역할을 합니다.
익명 함수와 네임드 함수
함수 표현식은 익명 함수와 네임드 함수로 나뉩니다. 익명 함수는 이름이 없는 함수로, 주로 콜백 함수나 즉시 실행 함수(IIFE)에서 사용됩니다.
예를 들어, 다음은 익명 함수를 사용하는 코드입니다:
const add = function(a, b) {
return a + b;
};
반면, 네임드 함수는 이름이 있는 함수로, 디버깅 시 함수 이름이 스택 트레이스에 표시되어 문제를 추적하기 용이합니다.
왜냐하면 네임드 함수는 함수 이름을 통해 호출 위치를 명확히 알 수 있기 때문입니다. 따라서, 디버깅이 필요한 경우 네임드 함수를 사용하는 것이 좋습니다.
익명 함수와 네임드 함수의 선택은 코드의 목적과 디버깅 필요성에 따라 결정됩니다.
함수 선언 방식이 리액트에 미치는 영향
리액트에서는 함수 선언 방식이 컴포넌트의 이름과 디버깅에 영향을 미칩니다. 함수형 컴포넌트는 함수 이름을 기반으로 디버깅 도구에서 표시됩니다.
예를 들어, 익명 함수로 작성된 컴포넌트는 디버깅 도구에서 'Anonymous'로 표시될 수 있습니다. 이를 방지하려면 네임드 함수나 디스플레이 네임(displayName) 속성을 설정해야 합니다.
다음은 디스플레이 네임을 설정하는 예제입니다:
const MyComponent = () => {
return Hello, World!;
};
MyComponent.displayName = 'MyComponent';
왜냐하면 디스플레이 네임은 디버깅 도구에서 컴포넌트를 명확히 식별할 수 있도록 도와주기 때문입니다. 따라서, 리액트 프로젝트에서는 함수 선언 방식과 디스플레이 네임 설정을 신중히 고려해야 합니다.
이러한 설정은 디버깅과 유지보수성을 높이는 데 중요한 역할을 합니다.
결론: 함수 선언문과 표현식의 활용
자바스크립트에서 함수 선언문과 표현식은 각각의 장단점이 있습니다. 함수 선언문은 호이스팅으로 인해 코드 어디에서든 호출이 가능하며, 함수 표현식은 블록 스코프 내에서만 유효하여 코드의 안전성을 높입니다.
또한, 익명 함수와 네임드 함수는 디버깅과 코드 가독성에 영향을 미칩니다. 특히, 리액트와 같은 프레임워크에서는 함수 선언 방식이 디버깅 도구와 컴포넌트 관리에 중요한 역할을 합니다.
왜냐하면 함수 선언 방식은 코드의 동작 방식과 유지보수성에 직접적인 영향을 미치기 때문입니다. 따라서, 상황에 맞는 함수 선언 방식을 선택하는 것이 중요합니다.
이 글을 통해 함수 선언문과 표현식의 차이를 이해하고, 이를 실무에 적용하여 더 나은 코드를 작성할 수 있기를 바랍니다.
이 컨텐츠는 F-Lab의 고유 자산으로 상업적인 목적의 복사 및 배포를 금합니다.
