일급 객체 란?

  1. 무명의 리터럴로 생성 할 수 있다. 즉 런타임에 생성이 가능하다.
  2. 변수나 자료구조에 저장 할 수 있다.
  3. 함수의 매개변수에 전달 할 수 있다.
  4. 함수의 반환값으로 사용할 수 있다.

<aside> 💡 자바스크립트 함수는 위의 조건을 모두 만족하므로 ‘일급객체'이다.

</aside>


//1. 함수는 무명의 리터럴로 생성 할 수 있다.
//2. 함수는 변수에 저장 할 수 있다.
const increase = function (num) {
  return ++num
}

const decrease = function (num) {
  return --num
}
// 2. 함수는 객체에 저장 할 수 있다.
const predicates = { increase, decrease }

// 3. 함수의 매개변수에 전달 할 수 있다.

function makeCounter(predicate) {
  let num = 0

// 4. 함수의 반환값으로 사용 할 수 있다.
  return function () {
    num = predicate(num)
    return num
  }
}

const increaser = makeCounter(predicates.increase);

console.log(increaser()) // 1
console.log(increaser()) // 2 

일급 객체로서 함수가 가지는 가장 큰 특징은 일반 객체와 같이 함수의 매개변수에 전달 할 수 있고, 함수의 반환값으로 사용할 수도 있다.

<aside> 💡 함수형 프로그래밍을 가능하게 하는 자바스크립트의 장점 중 하나이다.

</aside>

함수는 객체이지만, 일반 객체와는 차이가 있다. 일반 객체는 호출 할 수 없지만, 함수 객체는 호출할 수 있다. 그리고 함수 객체는 일반 객체에는 없는 함수 고유의 프로퍼티를 소유한다.

함수 객체의 프로퍼티

함수는 객체다. 따라서 함수도 프로퍼티를 가질 수 있다.

<aside> 💡 arguments, caller, length, name, prototype 프로퍼티는 모두 함수 객체의 데이터 프로퍼티다. 이 프로퍼티들은 일반 객체에는 없는 함수 객체의 고유 프로퍼티이다.

</aside>

arguments 프로퍼티