JS 스터디 18장

황상진·2022년 7월 8일
0

JavaScript

목록 보기
17/27
post-thumbnail

함수와 일급 객체

일급 객체란?

  • 다음 조건을 만족하는 객체를 말한다.
    1. 무명의 리터럴로 생성할 수 있다.
    2. 변수나 자료구조(객체, 배열)에 저장할 수 있다.
    3. 함수의 매개변수에 전달할 수 있다.
    4. 함수의 반환값으로 사용할 수 있다.
// 함수는 무명의 리터럴로 생성할 수 있으며 변수에 저장할 수 있다.
const increase = function(num) {
  return num++;
};

const decrease = function(num) {
  return num--;
};

// 함수는 객체에 저장할 수 있다.
const operations = { increase, decrease };

// 함수의 반환값으로 사용될 수 있다.
function makeCounter(operation) {
  let num = 0;
  
  return function() {
    num = operation(num);
    return num;
  };
}

// 함수의 매개변수에 전달할 수 있다.
const increaser = makeCounter(operations.increase);
console.log(increaser());

// 결과
1
  • 결국, 함수가 일급 객체라는 것은 함수를 객체와 동일하게 사용할 수 있다는 것이다. 객체는 값이므로 함수도 값과 동일하게 취급할 수 있다.
  • 따라서, 함수는 값을 사용할 수 있는 곳이라면 어디서든지 리터럴로 정의할 수 있으며 런타임에 함수 객체로 평가된다.

함수가 일급 객체인게 왜 중요성

  • 일급 객체로서 함수가 가지는 가장 큰 특징은 일반 객체와 같이 함수의 매개변수에 전달할 수 있으며, 함수의 반환값으로도 사용할 수 있다.
  • 이는 자바스크립트의 장점 중 하나인 함수형 프로그래밍을 가능하게 한다.

함수형 프로그래밍

  • 순수 함수와 보조 함수의 조합을 통해 외부 상태의 변경을 최소화해서 불변성(Immutability)을 지향하는 프로그래밍 패러다임을 말한다.
  • 쉽게 말하면 깔끔하고 유지보수가 용이하게 하기위해 효과적으로 함수를 사용하는 것을 말한다.

함수와 일반 객체

함수는 객체이지만 일반 객체와는 차이점이 있다.

  • 일반 객체는 호출할 수 없지만 함수 객체는 호출 가능(callable)하다.
  • 일반 객체에는 없고 함수 객체만이 가지고 있는 고유의 프로퍼티가 존재한다.
    함수만이 가지고 있는 프로퍼티를 살펴보면 다음과 같다

함수 객체의 프로퍼티

  • 함수도 객체이기 때문에 프로퍼티를 갖는다.
function add(num) {
  return num + num;
}

console.dir(add);

  • 또, add 함수의 모든 프로퍼티의 프로퍼티 어트리뷰트를 Object.getOwnPropertyDescriptors로 확인해보면 다음과 같다.
console.log(Object.getOwnPropertyDescriptors(add));

// 결과
{
  length: { value: 1, writable: false, enumerable: false, configurable: true },
  name: { value: 'add', writable: false, enumerable: false, configurable: true },
  arguments: { value: null, writable: false, enumerable: false, configurable: false },
  caller: { value: null, writable: false, enumerable: false, configurable: false },
  prototype: { value: {}, writable: true, enumerable: false, configurable: false }
}
  • 위 코드의 결과처럼 함수 객체는 length, name, arguments, caller, prototype 5개의 데이터 프로퍼티를 가진다.
profile
Web FrontEnd Developer

0개의 댓글