함수 객체
자바 스크립트에서 함수는 객체이다. 함수의 기본 기능인 코드의 실행 뿐 아니라 프로퍼티들을 가질 수 있기 때문이다. 함수를 생성하게 되면 함수 코드는 함수 객체의 [[Code]] 내부 프로퍼티에 저장된다. 또한 동적으로 프로퍼티를 할당할 수 있다. 이런 함수가 일반 객체 처럼 취급될 수 있기 때문에 자바스크립트의 함수는 다음과 같은 동작이 가능하다.
- 리터럴에 의한 생성
- 동적으로 프로퍼티를 생성 및 할당 가능
- 변수나 배열의 요소, 객체의 프로퍼티 등에 할당 가능
- 다음 코드에서 foo와 bar의 차이는 foo는 값을 가지고 있고 bar는 함수의 참조값을 가진다
1 | //변수에 할당 |
- 함수의 인자로 전달 가능
1 | //func를 함수 인자로 전달 |
- 함수의 리턴값으로 리턴 가능
1 | //리턴 값으로 활용 |
그리고 이런 기능들이 모두 가능한 객체를 일급 객체(First Class)라고 한다
함수 객체 표준 프로퍼티
ECMA5 스크립트 명세서에는 모든 함수가 length와 prototype 프로퍼티를 가져야 한다고 기술되어 있다
ECMA5 비표준 프로퍼티
- name 프로퍼티 : 함수 이름
- caller 프로퍼티 : 자신을 호출한 함수의 참조값
- arguments 프로퍼티 : 함수를 호출할 때 전달된 인자 값
- __proto__ 프로퍼티 : 함수의 부모 역할을 하는 프로토 타입 객체
- ECMA5표준에선 이를 Function.prototype 객체 라고 한다
- Function.prototype 객체는 constructor 프로퍼티, toString() 메서드, apply메서드, call 메서드, bind 메서드를 가진다
ECMA5 표준 프로퍼티
- length 프로퍼티 : 함수가 요구하는 인자의 수
- prototype 프로퍼티 : constructor 프로퍼티 하나만 존재하는 객체
- 함수의 prototype 프로퍼티는 프로토 타입 객체를 참조한다
- 프로토 타입 객체의 constructor 프로퍼티는 함수를 참조한다