본문 바로가기

개발/javascript

함수06 - 함수 표현식

"함수"

 

4.2. 함수 표현식

앞에서 언급했듯이 자바스크립트의 함수는 객체 타입의 값이다. 자바스크립트의 함수는 값처럼 변수에 할당할 수도 있고 프로퍼티 값이 될 수도 있으며 배열의 요소가 될 수도 있다. 이처럼 값의 성질을 갖는 객체를 일급 객체(first-class object)라 한다. 자바스크립트의 함수는 일급객체이다. 함수가 일급 객체라는 것은 함수를 값처럼 자유롭게 사용할 수 있다는 의미다.

 

함수는 일급 객체이므로 함수 리터럴로 생성한 함수 객체를 변수에 할당할 수 있다. 이러한 함수 정의 방식을 함수 표현식(Function expression)이라 한다. 함수 선언문으로 정의한 함수 add를 함수 표현식으로 바꾸어 정의하면 아래와 같다.

// 함수 표현식
var adad = function (x, y) {
	return x + y;
};

console.log(add(2, 5));	// 7

함수 리터럴의 함수 이름은 생략할 수 있다. 이러한 함수를 익명함수(anonymous function)이라 한다. 함수 표현식의 함수 리터럴은 함수 이름을 생략하는 것이 일반적이다.

 

함수 선언문에서 살펴본 바와 같이, 함수를 호출할 때는 함수 이름이 아니라 함수 객체를 가리키는 식별자를 사용하여야 한다. 함수 이름은 함수 몸체 내부에서만 유효한 식별자이므로 함수 이름으로 함수를 호출할 수 없다.

 

// 기명 함수 표현식
var add = function foo (x, y) {
	return x + y;
};

// 함수 객체를 가리키는 식별자로 호출
console.log(add(2, 5));	// 7

// 함수 이름으로 호출하면 ReferenceError가 발생한다.
// 함수 이름은 함수 몸체 내부에서만 유효한 식별자이다.
console.log(foo(2, 5));	// ReferenceError: foo is not defined

 

자바스크립트 엔진은 함수 선언문의 함수 이름으로 식별자를 암묵적 생성하고 생성된 함수 객체를 할당하므로 함수 표현식과 유사하게 동작하는 것처럼 보인다. 하지만 함수 선언문과 함수 표현식이 정확히 동일하게 동작하지는 않는다.

함수 선언문은 "표현식이 아닌 문"이고 함수 표현식은 "표현식인 문"이다. 따라서 미묘하지만 중요한 차이가 있다.(함수 호이스팅)

'개발 > javascript' 카테고리의 다른 글

함수08 - Function 생성자 함수  (0) 2023.10.04
함수07 - 함수 생성 시점과 함수 호이스팅  (0) 2023.10.04
함수05 - 함수 선언문  (0) 2023.10.03
함수04 - 함수 정의  (0) 2023.10.03
함수03 - 함수 리터럴  (1) 2023.10.03