2012-07-02 4 views
2
function Apple(){ 
    this.name="apple"; 
} 
function Orange(){ 
    this.name="orange"; 

    this.apple = new Apple(); 
    this.apple.onCalled=function(){ 
     alert(this.name); 
    } 
} 
Orange.prototype.onCalled=function(){ 
    this.apple.onCalled(); 
} 
var orange = new Orange(); 
orange.onCalled(); 

현재 코드는 "사과"를 보여줍니다. "this.apple.onCalled = function()"행을 수정하여 "주황색"을 표시하도록하려면 어떻게해야합니까?함수 인수의 JavaScript 실행 컨텍스트

즉, 다른 객체에 함수를 전달하고 싶습니다. 그러나 해당 함수가 호출 될 때 함수를 실행하는 객체의 변수가 아니라 함수를 전달한 객체의 변수에 액세스하십시오. 분명한 해결 방법은 전역 변수 (예 : orange.name)를 사용하는 것이지만 많은 객체가 있기 때문에 더 나은 방법을 찾고 있으며 모든 것을 글로벌하게하고 싶지 않습니다.

+0

회원 :

http://jsfiddle.net/XrtZe/가에서보세요. JS에서는 'this'는 변수 범위와는 아무런 관련이 없습니다. 또한 코드에서 함수를 전달하지 않습니다. –

+0

그런 다음 함수를 "지정한"개체입니다. 다른 시나리오에서는 무언가가 끝났을 때 실행되는 콜백 함수를 전달하고 있는데, 이는 같은 솔루션으로 해결할 수 있다고 생각합니다. – kevin

답변

4

클로저를 사용하십시오.

function Orange(){ 
    this.name="orange"; 

    this.apple = new Apple(); 
    var that = this; 
    this.apple.onCalled=function() { 
     alert(that.name); 
    } 
} 

는, 그것은 조금 까다로운하지만 이해하기 쉬운 방법 JS에서 this 작품 키워드 읽게한다.

1

당신은 쓸 수 :

Orange.prototype.onCalled=function(){ 
    this.apple.onCalled.call(this); 
} 

그것은 일반적인 대답을하기 어렵다. 이해해야 할 것은 this이 모든 함수 호출에 바인딩된다는 것입니다. 이는 명시 적으로 call 또는 apply 함수를 사용하여 제어하거나, 객체의 속성으로 함수에 액세스 할 때 . 연산자를 사용하여 명시 적으로 제어 할 수 있습니다.

클로스 사용에 대한 Kos의 답은 관련성이있을 수도 있습니다. 그것은 당신이 원하는 효과에 달려 있습니다.

1
Orange.prototype.onCalled=function(){ 
    this.apple.onCalled.call(this); 
} 

예 : 변수와는 아무 상관 this``의 Scope in JavaScript