함수와 일급 객체

일급 객체로서의 함수

다음 조건을 만족하는 객체를 일급 객체라고 한다.

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

자바스크립트의 함수는 위의 조건들을 모두 만족하므로 일급 객체이다.
함수가 일급 객체라는 것은 함수를 객체와 동일하게 사용할 수 있다는 의미고, 값을 사용할 수 있는 곳이라면 어디서든지 리터럴로 정의할 수 있다는 것이다.

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

함수가 일급 객체로 취급되는 5가지 경우에 대해 알아보자.

변수에 변수를 할당

자바스크립트에서 함수는 값으로 취급되기 때문에, 다른 변수와 마찬가지로 변수에 할당할 수 있다.

const sayHello = function() {
  console.log('Hello!');
};

sayHello(); // "Hello!" 출력

함수를 인자로 다른 함수에 전달

함수를 다른 함수에 인자로 전달할 수 있다. 매개변수로써 쓰이는 함수를 콜백 함수라고 한다.

function callFunction(func) {
  func();
}

const sayHello = function() {
  console.log('Hello!');
};

callFunction(sayHello); // "Hello!" 출력

함수 반환

함수가 다른 함수를 반환할 수 있다. 함수 팩토리나 클로저를 작성하는데 사용된다.

function createAdder(num) {
  return function(x) {
    return x + num;
  }
}

const addFive = createAdder(5);
console.log(addFive(10)); // 15 출력

객체의 프로퍼티로 함수 할당

객체의 프로퍼티 값으로 함수를 할당할 수 있다.

const person = {
  name: 'Sanghyeon',
  sayHello: function() {
    console.log(`Hello, my name is ${this.name}`);
  }
};

person.sayHello(); // "Hello, my name is Sanghyeon" 출력

배열의 요소로 함수 할당

함수는 배열의 요소로도 넣을 수 있다.

const myArray = [
  function(a, b) {
    return a + b;
  },
  function(a, b) {
    return a - b;
  }
];

console.log(myArray[0](5, 10)); // 15 출력
console.log(myArray[1](10, 5)); // 5 출력

참조