2011-05-01 16 views
1

原諒我的經驗,但這裏的問題,我有一些2個函數,其中1個調用.getJSON,我需要從第一個函數的getJSON回調中調用第二個函數..我有很多麻煩。JavaScript,範圍問題...不是非常有經驗的javascript

下面是正在進行的簡化版本。

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 
} 

的問題是在.getJSON的回調函數,我想打電話給myFunction2但使用「this.myFunction2()」我不能把它稱之爲......我想訪問XHR請求中的'myFunction2'(這就是我通過螢火蟲看到的),並且使用我以前創建的var'self'不工作,或者因爲它不在範圍內,我認爲,螢火蟲不顯示任何變量'self'在回調函數中時,當然當我嘗試使用時它不起作用。

任何想法?還需要更詳細的說明嗎?

+0

如果'self'不在範圍內,則在嘗試執行'self.something'時會出現錯誤。也許你的問題是別的? – hugomg 2011-05-01 18:18:37

回答

-1

你在哪裏調用renderEntry()?這是代碼的關鍵部分。它不知道自己,因爲它在調用renderEntry()函數時未初始化。當你調用_myFunction1時,自我被初始化,並且當函數完成執行時它就會失效。

你知道你只是初始化 renderEntry函數而不是調用它呢?

+0

這是//這裏的更多代碼 – 2011-05-01 17:53:53

+0

不知道,你的意思是「死去」,我強烈懷疑它不是JS的任何東西。 – julkiewicz 2011-05-01 18:22:59

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(); 
  • 確保您的請求被成功。
  • 刪除"json"參數($.getJSON只有3個參數)。
  • 發佈更多代碼。