자바스크립트에선 함수도 객체다
함수의 기본 기능인 코드 실행 뿐만 아니라, 프롵퍼티들을 가질수 있는 등 객체의 성질도 가진다
var add = function(x, y) {
return x + y;
};
add.result = add(3, 2);
add.status = 'OK';
print(add.result);
print(add.status);
console.dir(add);
함수가 객체이므로, 함수도 일반 객체처럼 취급될 수 있다
그러므로 다음 동작들이 가능하다
이와 같은 기능으로 함수를 일급객체 라고 부른다
일급 객체인 함수의 특성을 이용하여 함수형 프로그래밍이 가능하다
함수는 값으로 취급될 수 있으므로 변수나 다른 객체의 프로퍼티의 값으로 할당할 수 있다
사실 함수 표현식 방법이 이와 같은 특성을 이용한 것이다
var foo = function() {
return 100;
};
print(foo());
var obj = {};
obj.func = foo;
print(obj.func());
함수는 다른 함수의 인자로도 전달이 가능하다
var foo = function (func) { // 함수를 인자로 전달받아 그 함수를 실행시키는 함수 foo
func();
};
foo(function () { // 익명함수
print("Function can be used as the argument");
});
함수는 다른 함수의 리턴값으로도 활용할 수 있다
var foo = function () {
return function() {
print('This function is the return value');
}
};
var func = foo();
func();
foo()();
함수는 객체이다 (기본 객체 성질 + 호출됐을 때 정의된 코드를 실행하는 기능)
함수 객체만의 표준 프로퍼티가 정의되어 있다
function add(x, y) {
return x + y;
}
console.dir(add);
arguments, caller, length 등의 프로퍼티가 있다
ECMA 표준 : prototype, length
ECMA 표준 X : name(함수 이름), caller(이 함수를 호출한 함수), arguments(함수를 호출할 때 전달한 인자값), proto(자신의 부모 역할을 하는 프로토타입 객체를 가리킴)
*\proto\*
ECMA 표준에서 정의한 모든 함수가 가져야 하는 표준 프로퍼티
함수가 정상적으로 실행될 때 기대되는 인자의 개수(함수를 작성할 때 정의한 인자 개수)
function func0() {
return;
}
function func1(x) {
return x;
}
function func2(x, y) {
return x + y;
}
print(func0.length); // 0
print(func1.length); // 1
print(func2.length); // 2
모든 함수는 객체로서 prototype 프로퍼티를 가지고 있다
함수 객체의 prototype 프로퍼티 vs 모든 객체의 부모를 나타내는 내부 프로퍼티인 proto를 혼동하면 안된다
prototype 프로퍼티와 [[Prototype]](notion://www.notion.so/vencott/%5C%5C_proto%5C%5C_) 프로퍼티
prototype 프로퍼티는 함수가 생성될 때 만들어지며, constructor 프로퍼티 하나만 있는 객체를 가리킨다
즉, 자바스크립트에선 함수를 생성할 때 함수 자신과 연결된 프로토타입 객체를 동시에 생성하며, 이 둘은 각각 prototype과 constructor라는 프로퍼티로 서로를 참조한다
function myFunction() {
return;
}
console.dir(myFunction.prototype); // constructor(ex 함수의 프로토타입 객체이므로)와 __proto__(프로토타입 객체 역시 객체이므로 예외 없이 자신의 부모 역할을 하는 __proto__프로퍼티가 있다)
console.dir(myFunction.prototype.constructor); // 프로토타입 객체와 매핑된 함수를 알아볼 수 있다
myFunction 함수 객체의 prototype 프로퍼티 --> myFunction.prototype(프로토타입 객체)
myFunction.prototype(프로토타입 객체)의 constructor 프로퍼티 --> myFunction 함수 객체
출처: 송형주, 고현준 저, 『인사이드 자바스크립트』, 한빛미디어(2014)