1 분 소요

Javascript 개념

모던 자바스크립트 딥 다이브 정리

함수와 일급 객체

일급 객체

일급 객체란?

  1. 이름 없이 생성할 수 있다.
  2. 변수나 객체 배열 등에 저장할 수 있다.
  3. 함수의 매개변수로 전달할 수 있다.
  4. 함수의 반환값으로 사용할 수 있다.
    위의 조건을 만족하는 객체를 일급 객체라고 한다.

함수는 위의 조건을 모두 만족하므로 일급 객체이다.
→ 런타임에 함수 객체로 평가되고, 값처럼 사용할 수 있다.
이런 특징들이 자바스크립트를 함수형 프로그래밍을 가능하게 하는 장점 중 하나이다.

함수 객체의 프로퍼티

함수는 객체이므로 프로퍼티를 가지고 있다.
추가적으로 일반 객체에는 없는 고유의 프로퍼티를 가지고 있다.
length, name, arguments, caller, prototype


arguments

arguments 프로퍼티는 arguments 객체이다.



함수는 인수를 받으면 arguements 객체에 키를 순서로, 값을 전달 받은 인수로 보관한다.
함수에 매개변수가 있으면 선언되고, undefined로 초기화된 후 전달 받은 인수로 할당된다.


  • arguments 객체의 프로퍼티

    • callee: arguments 객체를 생성한 함수 → 함수 자기 자신
    • length: 인수의 개수
    • 가변 인자 함수 구현 자바스크립트는 함수의 매개변수와 인수의 개수 일치 여부를 검사하지 않기 때문에 구현한다.

      function sum() {
        let res = 0;
      
        // arguments 객체는 length 프로퍼티가 있는 유사 배열 객체이므로 for 문으로 순회할 수 있다.
        for (let i = 0; i < arguments.length; i++) {
          res += arguments[i];
        }
      
        // arguments 객체를 배열로 변환하여 구현할 수도 있다.
        const array = Array.prototype.slice.call(arguments);
        return array.reduce(function (pre, cur) {
          return pre + cur;
        }, 0);
      
        return res;
      }
      
      console.log(sum()); // 0
      console.log(sum(1, 2)); // 3
      console.log(sum(1, 2, 3)); // 6
      

      객체를 배열로 변환하는 등의 번거로움을 해결하기 위해 ES6에서는 Rest 파라미터가 도입되었다.

      // ES6 Rest parameter
      function sum(...args) {
        return args.reduce((pre, cur) => pre + cur, 0);
      }
      
      console.log(sum(1, 2)); // 3
      console.log(sum(1, 2, 3, 4, 5)); // 15
      


caller

ECMAscript 사양에 포함되지 않은 비표준 프로퍼티이다. 표준화 예정에 없기 때문에 사용하지 않도록 한다.


length

함수를 정의할 때 선언한 매개변수의 개수를 가리킨다.


name

함수의 이름을 나타낸다.


prototype

생성자 함수로 호출될 때(new 키워드와 함께) 함수가 생성한 인스턴스의 프로토타입 객체를 가리킨다.

prototype 프로퍼티는 constructor(생성자 함수)만 가지고 있는 프로퍼티이다.
일반 객체와 non-constructor에는 prototype 프로퍼티가 없다.


__proto__접근자 프로퍼티

모든 객체는 내부 슬롯 [[Prototype]] 을 갖는다.
__proto__ 프로퍼티는 [[Prototype]] 내부 슬롯이 가리키는 프로토타입 객체에 접근하기 위한 프로퍼티이다.
함수 객체가 직접 가지고 있는 프로퍼티가 아니다.

댓글남기기