Chapter 18 함수와 일급 객체

function and first-class object

18.1 일급 객체

아래 4개 조건 만족 시 일급객체

1. 무명의 리터럴로 생성 가능 (런타임에 생성 가능하다는 뜻)
2. 변수나 자료구조 (ex: 객체) 에 저장 가능
3. 함수의 매개변수로 사용 가능
4. 함수 return으로 사용 가능
  • 함수를 객체랑 동일하게 사용할 수 있다는 것 (runtime에 함수 객체로 평가됨)
  • 함수 vs 일반객체:
    • 함수는 호출가능하며
    • 함수객체는 고유 property 를 보유함

18.2 함수 객체의 프로퍼티

  1. arguments (인수) 프로퍼티 : 순회가능한 객체. {0: 'a', 1: 'b', ...} 형태로 저장

    • 매개변수 <-> 인수 개수 확인 X. 에러발생X.
    • 매개변수는 undefined 로 초기화 시킨 다음에 인수 전달되면 재할당함
    • 초과 인수 전달돼도 일단 가지고 있음!
    • 유사배열객체이자 이터러블 하기 때문에
      • 매개변수 개수를 확정할 수 없는 가변인자 함수 구현할때 유용함 (arguments.length로 순회 가능하니..)
      • 유사배열객체는 iterable 하지만 배열 method들은 사용 불가 (throw error)해서 간접적으로 사용해야 한다는 불편함이 있음
  2. caller 프로퍼티 : 비표준임. 본인 호출하는 함수 기억
  3. length 프로퍼티 : 매개변수 개수
  4. name 프로퍼티 : a.name 값:

    • 기명함수: const a = function b(){}; 일 경우 => a.name => b
    • 익명함수(ES6): const a = function(){}; 일 경우 => a.name => a
  5. prototype 프로퍼티 : constructor 함수에만 존재
  6. __proto__: [[Prototype]] slot 접근하기 위한 접근자 프로퍼티

    • 함수 고유 프로퍼티 아님!!!
    • object.hasOwnProperty('__proto__') -> false나옴
Q. 가변인자 함수 in typescript?
  1. arguments 객체활용한 가변인자 함수: (권장X)

    function oldStyleSum(): number {
      let sum = 0;
      for (let i = 0; i < arguments.length; i++) {
        sum += arguments[i] as number;
      }
      return sum;
    }
    
  2. 우리가 흔히 보던 거:

    function sum(...numbers: number[]): number {
      return numbers.reduce((acc, curr) => acc + curr, 0);
    }
    
    // 사용 예시
    console.log(sum(1, 2, 3)); // 6
    console.log(sum(1, 2, 3, 4, 5)); // 15