함수(function)를 생성하거나 함수에 대한 API를 제공한다.
ECMAScript의 모든 함수는 Function
객체를 상속받는다. 또한 Function
객체 자신은 Object
객체를 상속받는다. 그래서 함수가 객체라는 사실을 분명히 한다. 그것도 그냥 객체가 아닌 일급 객체(first class object)
라는 것이다.
함수는 객체를 생성(new Function()
과 다름)하는 역할을 하기도 한다. 이 말은 객체가 객체를 생성한다는 뜻과 같다. 생성된 객체는 Function
객체의 성격을 갖지 않고 완전한 객체가 된다.
function Demo(x) {
this.x = x;
}
console.log(typeof Demo);
//->> "function"
console.log(typeof Demo.__proto__);
//->> "function"
console.log(typeof Demo.__proto__.__proto__);
//->> "object"
console.log(typeof new Demo(1));
//->> "object"
console.log(typeof new Demo(1).__proto__);
//--> "object"
상기 코드는 아래의 [예제]에서 확인이 가능하다.
완전한 객체
완전한 객체라는 표현은 다른 오해를 불러올 수도 있을 것 같다. 잘 알려져 있는 의미로 함수는 어떠한 기능이 작동하기 위해 분리된 공간으로 나누어 놓은 구현체를 말한다. 보통 여기에 해당하는 함수를 일반 함수(regular function)라 부를 수 있다. 반면 기본적으로는 일반 함수와 다르지 않지만 내부적으로
this
지시자를 가지고[[Prototype]]
으로 확장하기 위한 목적을 가진 함수도 있다. 이러한 함수는new
연산자와 함께 호출해야 한다. 여기에 해당하는 함수를 생성자 함수(constructor)라고 부른다. 이렇게 자바스크립트는 크게 일반 함수와 생성자 함수로 구분할 수 있다. 일반 함수 또는 생성자 함수는 모두Object
객체를 상속한Function
객체를 상속받는다. 완전한 객체의 의미는Object
객체만을 상속받은 객체이며 생성자 함수에 의해서 생성된 객체를 나타낸다.
함수는 일반적으로 리터럴(literal)로 작성한다. 리터럴로 구현된 함수도 Function
객체의 인스턴스이다. 실제로 테스트 코드를 아래의 [예제]에서 확인하기 바란다. 그리고 함수에 대한 기본적인 내용은 자바스크립 함수
문서를 참조하기 바란다. Object
객체를 상속한 Function
객체는 함수에 대한 API를 지원하지만 다른 객체와 마찬가지로 생성자를 가지고 있다. 즉 동적으로 함수를 생성할 수 있다는 뜻이다. 이 부분은 실제로 생성자 함수를 참조하기 바란다. 분명 필요한 기능이긴 하지만 리터럴로 생성한 함수와는 다음과 같은 중요한 차이가 있다.
클로저(closures)
를 생성하지 않는다.Function
객체를 생성하는 방법을 나타낸다. Functoin()
생성자 함수를 사용하는 것과 리터럴(literal)로 생성하는 방법이 있다. 리터럴로 생성하는 경우에도 Function
객체를 상속받는다.
사용자 함수를 생성하는 생성자 함수이다.
지정된 this
와 제공된 인수를 가진 배열 또는 유사 배열로 함수를 호출한다.
원본 함수와 동일한 본문을 갖는 바인딩된 함수를 만든다. this
키워드가 있는 경우 실제로 자신을 참조할 수 있도록 활성화된다.
인수를 지정하여 함수를 호출한다.
함수의 소스 코드를 반환한다.