본문으로 바로가기

JavaScript에서 함수를 정의하는 방법에는 함수 선언형(Function Declaration)과 함수 표현식(Function Expression) 두 가지가 있습니다. 

 

 

함수 선언형 (Function Declaration)

  • 함수 선언형은 함수 이름과 함수 본문으로 구성됩니다.
  • 함수 선언은 전역 스코프 또는 함수 스코프에서 사용할 수 있으며, 호이스팅(hoisting)이 발생합니다. 이는 함수를 선언하기 전에 호출해도 오류가 발생하지 않는다는 것을 의미합니다.
  • 함수 선언형은 함수 이름이 필수이며, 함수 표현식과 달리 이름을 가지고 있기 때문에 재귀적인 함수 호출에 유용합니다.
function greet(name) {
  console.log(`Hello, ${name}!`);
}

greet('Star'); // 함수 선언을 호출

 

 

함수 표현식 (Function Expression)

  • 함수 표현식은 함수를 변수에 할당하여 정의하는 방식입니다.
  • 함수 표현식은 변수 스코프나 함수 스코프 내에서 정의될 수 있으며, 호이스팅은 변수 선언만 호이스팅되며 함수 본문은 호이스팅되지 않습니다.
  • 함수 표현식은 익명 함수로 정의할 수도 있지만, 이름을 붙일 수도 있습니다. 이름이 없는 경우 해당 함수를 익명 함수로 사용할 수 있습니다.
const greet = function(name) {
  console.log(`안녕, ${name}!`);
};

greet('Star'); // 함수 표현식을 호출

 

 

주요 차이점

   함수 선언형(Declaration)  함수 표현식(Expression)
 호이스팅  함수 전체가 호이스팅되어 선언 이전에 호출  변수만 호이스팅되어 함수 본문은 호이스팅되지 않음
 함수 이름  항상 이름을 가지고 있음  이름을 가지거나 익명 함수로 정의

 

두 가지 방식은 다양한 상황에서 사용될 수 있으며, 선택은 코드 구조와 요구 사항에 따라 달라질 수 있습니다.

 

 

호이스팅

자바스크립트에서 변수 및 함수 선언이 코드의 맨 위로 끌어올려지는 동작을 가리키는 개념입니다. 이것은 코드 실행 순서와 관련된 중요한 동작 중 하나이며, 초기에는 직관적이지 않을 수 있습니다. 호이스팅은 코드의 이해와 디버깅을 돕기 위한 목적으로 도입되지 않았지만, 자바스크립트 엔진의 동작 방식 중 하나입니다.

 

1. 변수 호이스팅

var 키워드로 선언된 변수는 해당 변수가 선언된 스코프 내에서 맨 위로 끌어올려지며, 초기화 단계에서 undefined로 초기화됩니다. 즉, 변수가 선언되기 전에 변수에 접근하더라도 오류가 발생하지 않고 undefined를 반환합니다.

console.log(x); // undefined
var x = 5;

 

2. 함수 호이스팅

함수 선언문(function)은 해당 함수가 선언된 스코프 내에서 맨 위로 끌어올려지며, 함수를 선언하기 전에 함수를 호출할 수 있습니다.

sayHello(); // "Hello"
function sayHello() {
  console.log("Hello");
}

 

주의해야 할 중요한 점은 호이스팅은 변수 및 함수 선언만을 끌어올리며, 변수에 할당된 값 또는 함수의 내용은 끌어올려지지 않습니다. 예를 들어, 변수 초기화 전에 변수에 접근하면 undefined가 반환되고 함수 호출은 가능하지만 함수 내용은 호이스팅되지 않으므로 정의되지 않은 변수 또는 함수 내용에 접근하려고 하면 오류가 발생합니다.