본문 바로가기

web../javascript

자바스크립트 코어 - 함수

# 중첩된 함수

 function hype(a, b){
          function square(x) {
                    return x*x;
          }

          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() 메서드

이 메서드를 사용하면 함수가 마치 다른 어떤 객체의 메서드인 것처럼 호출 할 수 있다.