2011-05-01 5 views
1

나의 미숙함을 용서해야하지만 여기에 문제가있다. 그들 중 1 명과 함께 2 개의 함수가있다 .getJSON과 첫 번째 함수의 getJSON 콜백 내에서 2 번째 함수를 호출해야한다. .. 나는 많은 어려움을 겪고있다.자바 스크립트, 스코프 문제 ... 자바 스크립트에 익숙하지 않다

다음은 현재 진행중인 작업을 단순화 한 것입니다. 문제는 .getJSON의 콜백 함수에

MyDialog.Widget.prototype._myFunction1 = function(data) { 
var self = this; 

var renderEntry = function(tr,booltf) { 
    $('<a href="javascript:{}">&nbsp;</a>') 
      .addClass("iconbutton") 
      .appendTo(tr.insertCell(0)) 
      .click(function() { 
       $.getJSON(
        "/command/button", 
        null, 
        function(data) { 
             self.myFunction2(); //self isn't in scope? 
             //this.myFunction2(); //this is actually 'this' for XHR request 
        }, 
        "json" 
       ); 
      }); 
//more code here (including the invoking of renderEntry() 
} 

MyDialog.Widget.prototype.myFunction2 = function() 
{ 
//Ton of code 
} 

, 나는 myFunction2를 호출 할하지만 난 'this.myFunction2을()'를 사용 ... 그것을 전화를받을 수 없습니다 나는 액세스를 시도하고있다 XHR 요청 내에서 'myFunction2'(방화 광을 통해 보이는 것)이며, 내가 만든 범위의 것이 아니기 때문에 이전에 만든 var 'self'를 사용하면 작동하지 않습니다. 방화 광은 어떤 변수도 표시하지 않습니다. 콜백 함수 내부에서는 'self'를 사용하고, 시도해도 그냥 작동하지 않습니다.

아이디어가 있으십니까? 더 이상의 정교화가 필요하지 않습니까?

+0

'self'가 범위에 없다면 'self.something'을 시도 할 때 오류가 발생합니다. 어쩌면 당신 문제는 다른 것일까요? – hugomg

답변

-1

어디에서 renderEntry()를 호출하나요? 이것이 바로 코드의 핵심 부분입니다. renderEntry() 함수가 호출 될 때 초기화되지 않았으므로 자체를 알지 못합니다. _myFunction1을 호출하면 self가 초기화되고, 함수가 실행을 끝내면 dead가됩니다.

당신은 당신은 단지 renderEntry 기능을 초기화하고를 호출하지 것을 깨닫게합니까?

+0

// 여기에 더 많은 코드가 있습니다 –

+0

"죽었습니다"라는 말이 무슨 의미인지, 나는 JS에 해당하는 것이 아니라는 강한 의구심을 가지고 있습니다. – julkiewicz

5

코드 범위가 좋습니다. self은 범위에 있고 원하는대로 this을 참조합니다. 디버거가 로컬 기능 범위에 없기 때문에 디버거에 표시되지 않을 수도 있지만 올바르게 해결되지 않는다는 의미는 아닙니다. 다음과 같이

더 간단한 경우

쉽게 입증 할 수 있습니다
  • var foo = { 
        fn: function(){ console.log('Called!'); }, 
        invoker: function(){ 
         var self = this, 
          local = function(){ setTimeout(function(){ 
            setTimeout(function(){ self.fn(); }, 1000); 
            }, 1000); }; 
         local(); 
        } 
    }; 
    
    foo.invoker(); 
    
    는 요청이 성공되어 있는지 확인합니다.
  • 인수 ($.getJSON에는 3 개의 매개 변수 만 있음)를 제거하십시오.
  • 코드를 더 게시하십시오.