본문 바로가기
개발공부_Blog/JavaScript

함수는 일급객체다

by 독서개발자 2022. 9. 24.

자바스크립트의 함수는 아래와 같은 조건을 만족하므로 일급객체

  1. 무명의 리터럴로 생성할 수 있다 ( = 익명함수를 만들 수 있다 )
  2. 변수나 자료구조( 객체, 배열 )에 저장할 수 있다
  3. 함수의 매개변수에 전달할 수 있다
  4. 함수의 반환값으로 사용할 수 있다 

 

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

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

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

// 3. 함수의 매개변수에 전달할 수 있다
// 4. 함수의 반환값으로 사용할 수 있다
function makeConunter (aux){
  let num = 0;

  return function (){
    num = aux(num);
    console.log(num)
    return num;
  };
}

// 3. 함수는 매개변수에게 함수를 전달할 수 있다 = 함수 호출의 인수
const increaser = makeConunter(auxs.increase);
    console.log(increaser()) // 1
    console.log(increaser()) // 2

const decreaser = makeConunter(auxs.decrease);
    console.log(decreaser()) // -1
    console.log(decreaser()) // -2

 

함수가 일급객체라는 것은 함수를 객체와 동일하게 사용할 수 있다는 의미

  • 값을 사용할 수 있는 곳이라면 어디서든지 리터럴로 정의할 수 있다
    ( 변수 할당문 - let, const  /  객체의 프로퍼티 값, 배열의 요소, 함수 호출의 인수, 함수 반환문 - return )
  • 런타임 함수 객체로 평가된다.
  • 일반 객체와 같이 함수의 매개변수에 전달할 수 있고, 반환값으로도 사용할 수 있다
  • 함수객체는 일반 객체에는 없는 함수 고유의 프로퍼티를 소유한다

 

함수 객체의 프로퍼티

함수도 프로퍼티를 가질 수 있다. console.dir메서드를 사용하여 함수 객체를 볼 수 있다.

function square(number){ 
    return number * number;
}
console.dir(square)

console.log() // HTML 트리구조 출력
console.dir() // JSON 트리구조 출력

 

 

square 함수의 모든 프로퍼티 속성도 Object.getOwnPropertyDescriptors메서드로 확인할 수 있다.

자바스크립트 엔진이 프로퍼티를 생성할 때 프로퍼티 어트리뷰트를 기본적으로 정의한다.
( 프로퍼티 값 value, 값의 갱신여부 writable, 열거가능 여부 enumerable, 재정의 가능여부 configurable )

하지만 프로퍼티 어트리뷰트는 자바스크립트 엔진이 관리하는 내부 상태값이라 우리가 직접 접근할 수는 없다.
하지만 디스크립터 메서드(Object.getOwnPropertyDescriptors)를 사용해 간접적으로 확인할 수 있다. 

 

1) argument 프로퍼티

  • 함수 호출 시 전달된 인수들의 정보를 배열 형태로 담고 있는 유사 배열 객체이다.
    ( 유사배열 객체 ? length프로퍼티를 가진 객체로 for문으로 순회할 수 있는 객체를 말한다 )
  • 함수 내부에서 지역변수처럼 사용된다.
  • 자바스크립트는 함수의 매개변수와 인수의 개수가 일치하는지 확인하지 않는다. 함수 호출 시 매개변수 개수만큼 인수를 전달하지 않아도 에러가 발생하지 않는다. 
  • 초과된 인수는 결과에 출력되지는 않지만 argument객체에 프로퍼티로 보관된다.
function multiply(x,y){
    console.log(arguments);
    return x*y;
}

console.log(multiply()) // NaN ( undefined * undefined )
console.log(multiply(1)) // NaN ( 1 * undefined )
console.log(multiple(1,2)) // 2
console.log(multiple(1,2,3)) // 2

 

 

2) caller 프로퍼티: ECMAscript 사양에 포함되지 않은 비표준 프로퍼티이다.

3) length 프로퍼티 :  length프로퍼티는 함수를 정의할 때 선언한 매개변수의 개수를 가리킨다.

4) name 프로퍼티 : name프로퍼티는 함수 이름을 나타낸다.

5) prototype 접근자 프로퍼티

 

 

댓글