[Javascript] 함수 (2) - 함수 선언문, 일급객체

YJMINT·2023년 7월 3일
1

모던자바스크립트

목록 보기
4/4

◽️ 함수 선언문

함수 선언문을 사용해 함수를 정의하는 방식은 다음과 같다.

// 함수 선언문은 표현식이 아닌 문이므로 변수에 할당할 수 없지만, 할당되는 것처럼 보인다.
var add = function add (x,y) {
  return x + y;
};

//함수 호출
console.log(add(2,5));

이렇게 동작하는 이유는 자바스크립트 엔진이 코드의 문맥에 따라 동일한 함수 리터럴을 표현식이 아닌 문인 함수 선언문으로 해석하는 경우와 표현식인 문인 함수 리터럴 표현식으로 해석하는 경우가 있기 때문이다.

// 1. 함수 선언문으로 해석
// 기명 함수 리터럴을 단독으로 사용하면 함수 선언문으로 해석된다.
// 함수 선언문에서는 함수 이름을 생략할 수 없다.

fuction foo() { console.log('foo'); }
foo(); //foo


// 2. 함수 리터럴 표현식으로 해석
// 함수 리터럴을 피연산자로 사용하면 함수 선언문이 아니라 함수 리터럴 표현식으로 해석된다.
// 함수 리터럴에서는 함수 이름을 생략할 수 있다.

(function bar() {console.log('bar'); });    //그룹연산자 () 사용
bar(); //ReferenceError : bar is not defined (bar는 함수 몸체 내에서만 참조할 수 있는 식별자이므로 함수를 호출할 수 없다.)

자바스크립트 엔진은 생성된 함수를 호출하기 위해 함수 이름과 동일한 이름의 식별자를 암묵적으로 생성하고, 거기에 함수 객체를 할당한다.

함수는 함수 이름으로 호출하는 것이 아니라 함수 객체를 가리키는 식별자로 호출 하는 것이다.

한가지 예시를 통해 위의 정리해보자.

var add = function foo (x, y) {
  return x + y;
}

위와 같은 함수를 호출하려면 add()를 사용해야 할까? foo()를 사용해야 할까?
정답은 add()를 사용해야 한다.
앞서 말했듯 함수는 함수 이름(foo)으로 호출하는 것이 아닌 함수 객체를 가리키는 식별자(add)로 호출해야 하기 때문이다. 참고로 위와 같은 함수를 '기명 함수 표현식' 이라고 한다.

◽️ 일급 객체

일급 객체란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.
값의 성질을 갖는 객체를 일급 객체라고 하며, 자바스크립트의 함수는 일급 객체이다.

일급 객체의 조건

  • 변수에 할당할 수 있다.
  • 다른 함수를 인자로 전달 받는다.
  • 다른 함수의 결과로서 리턴될 수 있다.
  • 동적으로 프로퍼티 생성이 가능하다.

함수가 일급 객체라는 것은 함수를 값처럼 자유롭게 사용할 수 있다는 의미이다.
함수는 일급 객체이므로 함수 리터럴로 생성한 함수 객체를 변수에 할당할 수 있다.

📚 참고문헌

https://velog.io/@reveloper-1311/일급-객체First-Class-Object란
https://mozzi-devlog.tistory.com/11

profile
YJMINT's develog

0개의 댓글