2011-03-22 4 views
7

나는 함수가 결과가 아니라 함수를 반환한다는 것을 많이 봅니다. 아래 예제는 함수 getWindow이 함수를 반환 함을 보여줍니다. 왜 변수 "win"을 반환 할 수 없습니까? 결과를 반환하고 기능을 사용할 때? 감사합니다.함수가 JavaScript의 결과와 결과를 반환 할 때

var A = function(){}; 
A.prototype= 
{ 
    getWindow : function() 
    { 
     var win = new B.window(); 
     return (
       this.getWindow = function() 
       { 
        return win; 
       })(); 

    } 
} 

답변

4

이 코드는 코드에 해당하지만, 이해하기 쉽다 :

A.prototype = { 
    getWindow: function() { 

     var win = new B.window(); 

     this.getWindow = function() { 
      return win; 
     }; 

     return win; 

    } 
} 

사용법 :

우선하는 A 인스턴스를 만들 : 그럼

var a = new A(); 

를 호출 해당 인스턴스의 getWindow :

a.getWindow(); 

여기서, 방법은 A.prototype입니다. 위의 코드에서 볼 수 있듯이 A.prototype.getWindownew B.window()을 반환하지만을 반환합니다. 그 사이에 인스턴스 객체에 getWindow이라는 메서드가 만들어집니다. 이제

, 다시 getWindow를 호출하지 않는 경우 : 인스턴스가 자체가 getWindow 메소드가 객체 때문에

a.getWindow(); 

A.prototype.getWindow

가 더 이상이라고합니다. 이 메서드는 getWindow 메서드가 처음 호출되었을 때 반환 된 동일한 "win"개체를 반환합니다.


귀하의 패턴은 여러에 대한 A 인스턴스가 자신의 "승리"객체의 인스턴스를 같은 A.prototype.getWindow 방법을 사용할 수 있습니다. 이것을 고려하십시오 : 이것은 당신의 코드가

입니다 :

return (this.getWindow = function() { 
    return win; 
})(); 

먼저 살펴 보겠습니다

var a1 = new A, 
    a2 = new A, 
    a3 = new A; 

a1.getWindow(); // creates window W1 and returns it 
a2.getWindow(); // creates window W2 and returns it 

a1.getWindow(); // returns window W1 
a2.getWindow(); // returns window W2 

a3.getWindow(); // creates window W3 and returns it 

a1.getWindow(); // returns window W1 
a2.getWindow(); // returns window W2 
a3.getWindow(); // returns window W3 

:)


업데이트 매우 유용한 패턴이다 괄호 안의 표현에서 :

this.getWindow = function() { return win; } 

보시다시피, 과제 식입니다. 익명 함수 객체는 this (인스턴스 객체)이 참조하는 객체의 getWindow 속성에 할당됩니다.

이 함수는 win 개체를 반환합니다.

이 할당 표현식의 결과는 함수 객체 자체입니다! 이것은 괄호 안의 값이 함수 객체라는 것을 의미합니다. 우리가 더 이상 필요하지 않기 때문에 우리는 괄호를 제거 할 수 있습니다

return (the_function_object)(); 

:

이제

,의 전체 그림을 살펴 보자

return the_function_object(); 

을 당신이 볼 수 있듯이,이 함수 객체가 호출되고 이면 해당 함수의 반환 값이 반환됩니다.

위에서 언급 한 것처럼이 함수는 win을 반환합니다. 따라서 코드는이에 해결합니다

return win; 

그래서 어떤 코드가하는 것은 :

를 FIRST, 그것은 this.getWindow-function() { return win; }를 할당합니다.

SECOND는 해당 함수를 호출 한 결과 인 win을 반환합니다.

내 코드는 동일한 결과를 생성하지만, 이해하기 쉽다 : 내가 제대로 이해 그래서 경우

this.getWindow = function() { 
    return win; 
}; 

return win; 
+0

, A 형에 '직접'기능은 동일한 이름을 가진 이전의 프로토 타입 기능을 덮어을? – pimvdb

+1

@pimvdb 아니요 - getWindow 메소드가 인스턴스 객체 자체에 추가됩니다 (위 코드에서 'a'). 'A.prototype.getWindow' 메서드는 수정되지 않았습니다. 그러나'a.getWindow'는 이제'A.prototype.getWindow' 메소드를 숨기므로 **이 프로토 타입 메소드는 인스턴스 객체'a'에 접근 할 수 없게됩니다. –

+0

왜 '반환'의 끝에 '()'이 필요합니까? – theateist

관련 문제