# 중첩된 함수
function hype(a, b){ return sqare(a) + square(b); |
중첩된 함수는 그 함수가 중첩되어 위치하는 함수의 최상위 레벨에서만 정의될 수 있다. 즉 if문이나 while 루프의 몸체 같은 문장
블록 안에서는 정의될 수 없다.
이러한 제약은 오직 function 문에 희한 함수 정의에만 해당한다.
그러나 함수 리터널은 어디에든 위치할 수 있다.
# 함수 리터널
//동일한 함수 정의한 것이다. function f(x){ return x*x } // function 문 var f = function(x) { return x*x } // 함수 리터널 |
함수 리터널은 비록 이름 없는 함수를 생성하지만 함수 리터널의 문법은 선택적으로 함수 이름을 지정하는 것도 허용한다.
var f = function fact(x){ .. }
이는 재귀 함수를 작성할 때에 유용하다.
함수 리터널은 자바스크립트 문장이 아니라 표현식으로 생성된다, 따라서 함수 리터널은 매우 유연하며, 또한 한 번만 사용되고 버려지기 때문에 이름 붙이지 않아도 되는 일회용 함수를 정의하는데 적합하다.
예를 들어 함수 리터럴 표현식에 의해 기술된 함수는, 변수에 저장될 수 있고 다름 함수에 전달인자로써 전달될 수도 있으며 곧바로 호출될 수도 있다.
var f = function(x) { return x*x; }; // 함수를 정의하여 이를 변수에 저장한다.
a.sort( function(a,b){ return a-b; } ); // 함수를 정의하여 이를 다른 함수에 전달한다.
var f = (function(x) { return x*x; })(10); // 정의하여 바로 호출한다.
# Arguments 객체
arguments는 Arguments 객체를 참조하는 특별한 프로퍼티이다.
자바스크립트 함수는 비록 고징된 개수의 이름 붙은 전달인자들로 정의되지만 호출 시점에서는 이 고정된 개수와는 상관없이 임의 개수의 전달인자들을 건네받을 수 있다. Arguments 객체는 이름이 붙어있든 없든 상관없이 건네 받은 모든 전달인자의 값에 접근하기 위한 방법을 제공한다.
<script> function person(){ alert( "arguments.length : " + arguments.length + "\n" + "arguments[0] : " + arguments[0] + "\n" + "arguments[1] : " + arguments[1] + "\n" + "arguments[2] : " + arguments[2] ); } person("aa", "bb", 3); </script> |
Arguments 객체의 callee 프로퍼티는 현재 실행되고 있는 함수를 가르키는 프로퍼티이다.
callee프로퍼티를 이용한 재귀 호출 function(x){ if( x<=1 ) return 1; return x * arguments.callee(x-1); } |
# 함수 프로퍼티와 메서드
>> length 프로퍼티
읽기 전용의 프로퍼티이며 함수가 건네 받기를 기대하는 전달인자의 개수를 반환한다.
function check(args){ var actual = args.length; // 실제로 건네 받은 전달인자 개수 var expected = args.callee.length; // 함수가 기대하는 전달인자 개수 if( actual != expected ){ // 두 수가 일치하지 않으면 예외 발생 throw new Error("Wrong number of arguments"); } } function f(x, y, z){ check(arguments); } f(1,2); |
>> prototype 프로퍼티
모든 함수에는 미리 정의된 prototype 객체를 가리키는 prototype 프로퍼티가 있다. prototype 객체는 함수가 new 연산자를 통해 생성자로 사용될 때, 새 객체를 정의하는 과정에서 매우 중요한 역할을 수행한다.
>> apply() 와 call() 메서드
이 메서드를 사용하면 함수가 마치 다른 어떤 객체의 메서드인 것처럼 호출 할 수 있다.
'web.. > javascript' 카테고리의 다른 글
DOM Script 속성과 메소드 (0) | 2013.10.11 |
---|---|
자바스크립트 - 객체지향(자바) 흉내내기 (0) | 2013.03.19 |
자바스크립트 코어 - 생성자와 프로토타입 (0) | 2013.03.19 |
자바스크립트 코어 - 객체 (0) | 2013.03.18 |