[JavaScript] 함수 - 2

함수 객체

자바 스크립트에서 함수는 객체이다. 함수의 기본 기능인 코드의 실행 뿐 아니라 프로퍼티들을 가질 수 있기 때문이다. 함수를 생성하게 되면 함수 코드는 함수 객체의 [[Code]] 내부 프로퍼티에 저장된다. 또한 동적으로 프로퍼티를 할당할 수 있다. 이런 함수가 일반 객체 처럼 취급될 수 있기 때문에 자바스크립트의 함수는 다음과 같은 동작이 가능하다.

  • 리터럴에 의한 생성
  • 동적으로 프로퍼티를 생성 및 할당 가능
  • 변수나 배열의 요소, 객체의 프로퍼티 등에 할당 가능
    • 다음 코드에서 foo와 bar의 차이는 foo는 을 가지고 있고 bar는 함수의 참조값을 가진다
1
2
3
4
5
6
7
8
9
//변수에 할당
var foo = 100;
var bar = function () { return 100; }
console.log(bar);

//프로퍼티에 할당
var obj = {};
obj.baz = function() { return 200; }
console.log(obj.baz());
  • 함수의 인자로 전달 가능
1
2
3
4
//func를 함수 인자로 전달
var foo = function(func) {
func();
};
  • 함수의 리턴값으로 리턴 가능
1
2
3
4
5
6
7
8
9
//리턴 값으로 활용
var foo = function() {
return function() {
console.log('this function is the return value');
};
};

var bar = foo(); //리턴 값으로 전달되는 함수가 bar에 담긴다
bar();

그리고 이런 기능들이 모두 가능한 객체를 일급 객체(First Class)라고 한다


함수 객체 표준 프로퍼티

ECMA5 스크립트 명세서에는 모든 함수가 lengthprototype 프로퍼티를 가져야 한다고 기술되어 있다

ECMA5 비표준 프로퍼티

  • name 프로퍼티 : 함수 이름
  • caller 프로퍼티 : 자신을 호출한 함수의 참조값
  • arguments 프로퍼티 : 함수를 호출할 때 전달된 인자 값
  • __proto__ 프로퍼티 : 함수의 부모 역할을 하는 프로토 타입 객체
    • ECMA5표준에선 이를 Function.prototype 객체 라고 한다
    • Function.prototype 객체는 constructor 프로퍼티, toString() 메서드, apply메서드, call 메서드, bind 메서드를 가진다

ECMA5 표준 프로퍼티

  • length 프로퍼티 : 함수가 요구하는 인자의 수
  • prototype 프로퍼티 : constructor 프로퍼티 하나만 존재하는 객체
    • 함수의 prototype 프로퍼티는 프로토 타입 객체를 참조한다
    • 프로토 타입 객체의 constructor 프로퍼티는 함수를 참조한다
Author: Song Hayoung
Link: https://songhayoung.github.io/2020/07/12/Languages/JS/function2/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.