일급 객체 는 다음 조건을 만족하는 객체를 뜻한다.
함수도 일급 객체이기 때문에, 함수를 예를 통해 조건을 설명한다.
무명의 리터럴로 생성 가능 하다 (런타임에 생성이 가능하다)
const increase = function (num) {return ++num}
변수나 자료구조(객체)에 저장할 수 있다.
const auxs = {increase}
함수의 매개변수에 전달할 수 있다.
function hi(aux){return 0}
함수의 반환값으로 사용할 수 있다.
function hi(aux){return aux(0)}
함수가 일급 객체라는 것은 함수를 객체와 동일하게 사용이 가능하다는 의미이다.
함수는 런타임에 객체로 평가된다.
일급 객체로 함수가 갖는 가장 큰 특징은
이 특징을 통해 함수형 프로그래밍이 가능하게 한다.
함수도 객체이기 때문에 프로퍼티를 가질 수 있다.
func 함수의 프로퍼티 어트리뷰트를 확인해보면 아래와 같다.
Object.getOwnPropertyDescriptors(func)
=> length,name,arguments,caller,prototype
__proto__
는 func 함수의 프로퍼티가 아니다.
func 함수는 Object.prototype
객체로부터 __proto__
접근자 프로퍼티를 상속받는다.
이처럼 위에서 보이는 프로퍼티는 일반 객체에는 없는 함수 객체의 데이터 프로퍼티이다.
하지만 __proto__
는 접근자 프로퍼티 이며, Object.prototype
을 상속받아 사용할 수 있기 때문에, 모든 객체가 사용 가능하다.
함수 객체의 arguments 프로퍼티 값은 arguments 객체이다.
arguments 객체는 함수 호출 시 전달된 인수들의 정보를 담고 있는 순회 가능한 유사 배열 객체이고, 함수 내에서 지역변수처럼 사용된다.
Function.arguments
와 같이 사용 가능하나, 표준에서 폐지되어 권장되지 않는다.
JS 함수의 매개변수와 인수의 객체가 일치하는지 확인하지 않아서 에러가 발생하지 않는다.
function sum(a, b) {
return a + b;
}
sum(1); // NaN
sum(1, 2, 3); // 3
남는 인수는 어떻게 될까? 없어지는 것이 아니라 arguments 객체에 저장이 된다.
function sum() {
let res = 0;
for (let i = 0; i < arguments.length; i++) {
res += arguments[i];
}
return res;
}
arguments 는 이터러블 하지만 배열이 아니기 때문에, 배열 메서드를 사용하면 에러가 난다.
함수에서의 length는 매개변수의 개수를 가리킨다.
함수 이름을 나타낸다. (익명 함수일 경우는 anonymousFunc
)
함수 객체는 prototype 프로퍼티를 소유한다.
접근하기 위해서는 proto 프로퍼티를 이용해 접근할 수 있다.