4.2 함수 객체 : 함수도 객체다

vencott·2021년 6월 2일
0

4.2.1 자바스크립트에서는 함수도 객체다

자바스크립트에선 함수도 객체다

함수의 기본 기능인 코드 실행 뿐만 아니라, 프롵퍼티들을 가질수 있는 등 객체의 성질도 가진다

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);

4.2.2 자바스크립트에서 함수는 값으로 취급된다

함수가 객체이므로, 함수도 일반 객체처럼 취급될 수 있다

그러므로 다음 동작들이 가능하다

  1. 리터럴에 의해 생성
  2. 변수나 배열의 요소, 객체의 프로퍼티 등에 할당 가능
  3. 함수의 인자로 전달 가능
  4. 함수의 리턴값으로 리턴 가능
  5. 동적으로 프로퍼티를 생성 및 할당 가능

이와 같은 기능으로 함수를 일급객체 라고 부른다

일급 객체인 함수의 특성을 이용하여 함수형 프로그래밍이 가능하다

4.2.2.1 변수나 프로퍼티 값으로 할당

함수는 값으로 취급될 수 있으므로 변수나 다른 객체의 프로퍼티의 값으로 할당할 수 있다

사실 함수 표현식 방법이 이와 같은 특성을 이용한 것이다

var foo = function() {
    return 100;
};
print(foo());

var obj = {};
obj.func = foo;
print(obj.func());

4.2.2.2 함수 인자로 전달

함수는 다른 함수의 인자로도 전달이 가능하다

var foo = function (func) { // 함수를 인자로 전달받아 그 함수를 실행시키는 함수 foo
    func();
};

foo(function () { // 익명함수
    print("Function can be used as the argument");
});

4.2.2.3 리턴값으로 활용

함수는 다른 함수의 리턴값으로도 활용할 수 있다

var foo = function () {
    return function() {
        print('This function is the return value');
    }
};

var func = foo();
func();

foo()();

4.2.3 함수 객체의 기본 프로퍼티

함수는 객체이다 (기본 객체 성질 + 호출됐을 때 정의된 코드를 실행하는 기능)

함수 객체만의 표준 프로퍼티가 정의되어 있다

function add(x, y) {
    return x + y;
}

console.dir(add);

arguments, caller, length 등의 프로퍼티가 있다

ECMA 표준 : prototype, length

ECMA 표준 X : name(함수 이름), caller(이 함수를 호출한 함수), arguments(함수를 호출할 때 전달한 인자값), proto(자신의 부모 역할을 하는 프로토타입 객체를 가리킴)

*\proto\*

  • 객체의 부모 역할을 하는 프로토타입 객체를 Function.prototype 객체라고 한다
  • 이것 역시 함수 객체이고, 이것의 proto는 Object.prototype 이다
  • Function.prototype 에는 apply, call 등의 메소드가 포함되어 있다.

4.2.3.1 length 프로퍼티

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

4.2.3.2 prototype 프로퍼티

모든 함수는 객체로서 prototype 프로퍼티를 가지고 있다

함수 객체의 prototype 프로퍼티 vs 모든 객체의 부모를 나타내는 내부 프로퍼티인 proto를 혼동하면 안된다

prototype 프로퍼티와 [[Prototype]](notion://www.notion.so/vencott/%5C%5C_proto%5C%5C_) 프로퍼티

  • 두 프로퍼티 모두 프로토타입 객체를 가리킨다는 공통점이 있다
  • [[Prototype]]는 객체 입장에서 자신의 부모 역할을 하는 프로토타입 객체를 가리킴(부모)
  • prototype 프로퍼티는 이 함수가 생성자로 사용될 때 이 함수를 통해 생성된 객체의 부모 역할을 하는 프로토타입 객체를 가리킴(자기자신)

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)

profile
Backend Developer

0개의 댓글