반응형
Javascript 함수

I. 메소드로서의 함수
    - 함수를 객체 프로퍼티에 할당하면 메소드로서 함수를 사용할 수 있다.
    - 함수를 메소드로서가 아니라 함수로 호출했다면 this 키워드는 전역 객체를 가리킨다.
    - 메소드로 호출된 함수는 호출한 객체를 this 라는 키워드로 받을 수 있다.
      그러나, 메소드로 호출된 메소드 안에서 중첩된 함수를 호출하면 중첩된 함수 내부에서 this 키워드는
      전역 객체를 가리킨다.

          var calculator = {
                operand1: 1,
                operand2: 1,
                compute: function() {
                    this.result = this.operand1 + this.operand2;    // this 는 calculator 객체를 나타낸다.
                }
          }; 
          calculator.compute();

II. apply()와 call() 메소드
    - call() 과 apply() 메소드를 사용하면 함수가 마치 다른 어떤 객체의 메소드 인 것 처럼 호출 할 수 있다.
    - call() 과 apply() 메소드의 첫번째 전달인자는 함수가 소속되어 호출될 객체를 나타내면 이 전달인자는
      함수 몸체 안에서 this 키워드의 값이 된다.

      아래의 코드는 함수 f()에 두 숫자를 전달하고 이 함수를 마치 객체 object 의 메소드인 것처럼 호출한다.
          f.call(object, 1, 2);

          object.m = f;
          object.m(1, 2);
          delete object.m;

    - apply() 메소드는 함수로 건네줄 전달인자를 배열로 지정한다.
        f.apply(object, [1, 2]);

III. 클로저(closure)
    - 중첩된 함수를 사용하고 반환할 수 있으며, 이렇게 중첩된 함수들은 closure라 불린다.
      아래 코드에서 o 는 객체, f 는 함수를 의미한다.
        function bindMethod( o, f ) {
            return function() { return f.apply(o, arguments); }     // 리턴되는 중첩된 anonymous 함수가 closure가 된다.
        }
        var person = { hello: function(arg) { alert(arg); } };
        var sum = bindMethod(person, hello);
        sum("Hello World");            // person 객체의 hello 메소드를 호출한다.


        function bindArguments( f, ) {
            var boundArgs = arguments;
            return function() {                            // 추가적인 전달인자와 합쳐서 호출된다. 이것을 currying 이라 부른다.
                var args = [];
                for (var i = 1; i < boundArgs.length; i++) args.push(boundArgs[i]);
                for (var i = 0; i < arguments.length; i++) args.push(arguments[i]);
                return f.apply(this, args);
            }
        }
 


 
반응형
Posted by seungkyua@gmail.com
,