2011-08-08 4 views
12

내에서 자바 스크립트 객체 메소드를 호출하는 MyClass 및 사용자 스크립트의 방법 다음내가 정의 콜백

function MyClass() { 
    this.myCallback = function() { 
     alert("MyClass.myCallback()"); 
    }; 

    this.startRequest = function() { 
     GM_xmlhttpRequest({ 
      'method': 'GET', 
      'url': "http://www.google.com/", 
      'onload': function (xhr) { 
       myClassInstance.myCallback(); 
      } 
     }); 
    }; 
} 

var myClassInstance = new MyClass(); 
myClassInstance.startRequest(); 

이 스크립트가 작동하고 myCallback() 방법은 GM_xmlhttpRequest 완료되면 호출되는합니다.

그러나이 코드는 onload 콜백이 전역 변수 myClassInstance을 참조하기 때문에 작동합니다. 나는에 onload 콜백 업데이트하는 경우 :

Uncaught TypeError: Object [object DOMWindow] has no method 'myCallback'.

그것은 this 잘못된 맥락에서 평가되고있는 것 같다 :

'onload': function (xhr) { 
    this.myCallback(); 
} 

를 다음 나는 (크롬) 오류가 발생합니다.

메서드를 myClassInstance으로 호출하는 방법은 전역 변수를 사용하지 않고도 가능합니까?

답변

23

올바른 범위에있는 this을 변수에 저장하십시오. 그것을 인스턴스에

this.startRequest = function() { 
    var myself = this; 
    GM_xmlhttpRequest({ 
     'method': 'GET', 
     'url': "http://www.google.com/", 
     'onload': function (xhr) { 
      myself.myCallback(); 
     } 
    }); 
}; 
+0

+1 나를 때려. – JAAulde

+4

+1 방금 세션을 끝내고 긴 시간을 보냈습니다. 고맙습니다. :) – Anthony

2

스토어를 참조하고 사용 : 그럼 당신은 나중에 참조 할 수

function MyClass() { 
    this.myCallback = function() { 
     alert("MyClass.myCallback()"); 
    }; 

    var instance = this; 

    instance.startRequest = function() { 
     GM_xmlhttpRequest({ 
      'method': 'GET', 
      'url': "http://www.google.com/", 
      'onload': function (xhr) { 
       instance.myCallback(); 
      } 
     }); 
    }; 
} 
4

가장 간단한 솔루션을 이미 머무는 this 별칭을 만드는 지적되면서 범위에 있습니다. 별칭의 가장 인기있는 변수 이름은 self 또는 that과 같은 것이지만 실제로는 아무 것도 작동합니다.

var f = this.callback.bind(this); 

... 
'onload': function(){ 
    f(); 
} 

바인드 나이에서 지원되지 않습니다 :

다른 대안은 (즉, 또는 수도 유스 케이스에 따라, 더 나은되지 않을 수도 있습니다) 대신하는 "일반"기능에 방법을 결합 및 사용 브라우저를 사용하지만 많은 JS 프레임 워크에서 대안을 찾을 수 있습니다. 내가 준 예제는 그다지 잘 보이지 않지만 콜백 함수로 메소드를 직접 전달하고자 할 때 매우 편리 할 수 ​​있습니다. (부분 함수 애플리케이션도 얻을 수 있습니다. 매우 정교합니다)

+2

'self' 때문에'self'에주의하십시오. – Jeremy

관련 문제