함수와 프로토타입 체이닝
함수 인자로 전달
함수는 다른 함수의 인자로도 전달이 가능하다.
1 2 3 4 5 6 7 8 9 10 | //함수 표현식으로 foo() 함수 생성 var foo = function(func) { func(); //인자로 받은 func() 함수 호출 }; //foo 함수 실행 (1) foo(function() { console.log('Function can be used as the argument.'); }); | cs |
foo() 는 함수 표현식 방법으로 생성한 함수로서, 인자로 받은 func 함수를 내부에서 함수 호출 연산자()를 붙여 호출하는 기능을 한다.
(1) foo() 함수를 호출할 때 함수 리터럴 방식으로 생성한 익명함수를 func 인자로 넘겼다. 따라서 foo() 함수 내부에서는 func 매개변수로 인자에 넘겨진 함수를 호출할 수 있다. 예제의 출력결과를 보면 알 수 있듯이 인자로 넘긴 익명 함수가 foo() 함수 내부에서 제대로 호출된 것을 알 수 있다.
리턴값으로 활용
함수는 다른 함수의 리턴값으로도 활용할 수 있다.
1 2 3 4 5 6 7 8 9 | //함수를 리턴하는 foo() 함수 정의 var foo = function () { return function () { console.log('this function is the return value') }; }; var bar = foo (); // (1) bar(); // (2) | cs |
foo() 함수는 console.log()를 이용해 출력하는 간단한 익명 함수를 리턴하는 역활을 한다.
이것이 가능한 이유 또한 함수 자체가 값으로 취급되기 때문이다.
(1) foo() 함수를 호출되면, 리턴값으로 전달되는 함수가 bar 변수에 저장된다.
(2) () 함수 호출 연산자를 이용해 bar()로 리턴된 함수를 실행하는 것이 가능
함수 객체의 기본 프로퍼티
자바스크립트에서는 함수 역시 객체이다. 이것은 함수 역시 일반적인 객체의 기능에 추가로 호출됐을 때 정의된 코드를 실행하는 기능을 가지고 있다는 것이다.
일반 객체와는 다르게 추가로 함수 객체만의 표준 프로퍼티가 정의 된다.
1 2 3 4 5 | function add(x, y) { return x + y; }; console.dir(add); | cs |
실제 함수가 어떤 객체 형태로 되어 있는지를 직접 확인해보고 이를 통해 함수의 표준 프로퍼티들을 확인하자
arguments 객체
arguments 프로퍼티와 같은 이름으로 ECMA 표준에서는 argments 객체를 정의하고 있다. argument 객체는 함수를 호출할 때 호출된 함수의 내부로 인자값과 함께 전달되며, arguments프로퍼티와 유사하게 함수를 호출할 때 전달 인자값의 정보를 제공해준다.
length 프로퍼티
ECMAScript에서 정한 모든 함수가 가져야 하는 표준 프로퍼티로서, 함수가 정상적으로 실행될 때 기대되는 인자의 개수를 나타낸다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | function func0 () { }; function func1 () { return x; } function func2 () { return x + y; } function func3 () { return x + y + z; } console.log('func0.lenght - ' + func0.lentgh); // func0. lenght - 0 console.log('func1.lenght - ' + func1.lentgh); // func0. lenght - 1 console.log('func2.lenght - ' + func2.lentgh); // func0. lenght - 2 console.log('func3.lenght - ' + func3.lentgh); // func0. lenght - 3 | cs |
출력값을 보면 함수 객체의 lenght 프로퍼티는 함수를 작성할 때 정의한 인자 개수를 나타내고 있음을 확인할 수 있다.
prototype 프로퍼티
모든 함수는 객체로서 prototype 프로퍼티를 가지고 있다. 함수 객체의 prototype 프로퍼티는 모든 객체의 부모를 나타내는 내부 프로퍼티 인 [[Prototype]]과 혼동하지 말아야한다는 주의점이 있다.
prototype 프로퍼티와 [[Prototype]]프로퍼티
두 프로퍼티 모두 프로토타입 객체를 가리킨다는 점에서는 공통점이 있지만. 관점에 차이가 있다. 모든 객체에 있는 내부 프로퍼티인 [[Prototype]]는 객체 입장에서 자신의 부모 역활을 하는 프로토타입 객체를 가르키는 반면, 함수 객체가 가지는 prototype 프로퍼티는 이 함수가 생성자로 사용될 때 이 함수를 통해 생성된 객체의 부모 역활을 하는 프로토타입 객체를 가르킨다.