18. 함수와 일급 객체

heyhey·2023년 7월 25일
0
post-thumbnail

일급 객체 는 다음 조건을 만족하는 객체를 뜻한다.
함수도 일급 객체이기 때문에, 함수를 예를 통해 조건을 설명한다.

  1. 무명의 리터럴로 생성 가능 하다 (런타임에 생성이 가능하다)
    const increase = function (num) {return ++num}

  2. 변수나 자료구조(객체)에 저장할 수 있다.
    const auxs = {increase}

  3. 함수의 매개변수에 전달할 수 있다.
    function hi(aux){return 0}

  4. 함수의 반환값으로 사용할 수 있다.
    function hi(aux){return aux(0)}

함수가 일급 객체라는 것은 함수를 객체와 동일하게 사용이 가능하다는 의미이다.

함수는 런타임에 객체로 평가된다.
일급 객체로 함수가 갖는 가장 큰 특징은

  • 매개변수로 전달이 가능하고
  • 함수의 반환값으로 사용할 수 있다는 점이다.

이 특징을 통해 함수형 프로그래밍이 가능하게 한다.

18.2 함수 객체의 프로퍼티

함수도 객체이기 때문에 프로퍼티를 가질 수 있다.

func 함수의 프로퍼티 어트리뷰트를 확인해보면 아래와 같다.
Object.getOwnPropertyDescriptors(func) => length,name,arguments,caller,prototype

__proto__ 는 func 함수의 프로퍼티가 아니다.
func 함수는 Object.prototype 객체로부터 __proto__ 접근자 프로퍼티를 상속받는다.

이처럼 위에서 보이는 프로퍼티는 일반 객체에는 없는 함수 객체의 데이터 프로퍼티이다.
하지만 __proto__는 접근자 프로퍼티 이며, Object.prototype을 상속받아 사용할 수 있기 때문에, 모든 객체가 사용 가능하다.

arguments 프로퍼티

함수 객체의 arguments 프로퍼티 값은 arguments 객체이다.
arguments 객체는 함수 호출 시 전달된 인수들의 정보를 담고 있는 순회 가능한 유사 배열 객체이고, 함수 내에서 지역변수처럼 사용된다.
Function.arguments와 같이 사용 가능하나, 표준에서 폐지되어 권장되지 않는다.

JS 함수의 매개변수와 인수의 객체가 일치하는지 확인하지 않아서 에러가 발생하지 않는다.

function sum(a, b) {
  return a + b;
}
sum(1); // NaN
sum(1, 2, 3); // 3

남는 인수는 어떻게 될까? 없어지는 것이 아니라 arguments 객체에 저장이 된다.

arguments 는 가변 인자 함수를 구현할 때 유용하다.

function sum() {
  let res = 0;
  for (let i = 0; i < arguments.length; i++) {
    res += arguments[i];
  }
  return res;
}

arguments 는 이터러블 하지만 배열이 아니기 때문에, 배열 메서드를 사용하면 에러가 난다.

length

함수에서의 length는 매개변수의 개수를 가리킨다.

name

함수 이름을 나타낸다. (익명 함수일 경우는 anonymousFunc)

prototype

함수 객체는 prototype 프로퍼티를 소유한다.
접근하기 위해서는 proto 프로퍼티를 이용해 접근할 수 있다.

profile
주경야독

0개의 댓글