2011-11-11 13 views
1

我有一些行爲不端的VAR範圍以下的js + jQuery代碼...或者至少一個行爲異常的編碼器:-P變量的作用域在JQuery中行爲不端

var lookup_output=""; //believe this makes it a global scope 

function lookupWord(word) { 
    var url = 'http://localhost:3000/jianti/' + word + '.json'; 
    lookup_output = "abc"; 

    $.getJSON(url, function(data){ 
      $.each(data, function(i, word_data){ 
        lookup_output += "<div> trad: " + word_data.fanti + "<br>"; 
        lookup_output += "simp: " + word_data.jianti + "<br>" ; 
        lookup_output += "pinyin: " + word_data.pinyin + "<br>" ; 
        lookup_output += "def: " + word_data.def + "<br>" ; 
        lookup_output += "</div><br>"; 
        alert(lookup_output); 
      });  
    }); 

    lookup_output += "123"; 
    return lookup_output; 
} 

的問題是該行

return lookup_output; 

還給

"abc123" 

而行

alert(lookup_output); 

"abc123<div> trad: 交流<br>simp: 交流<br>pinyin: jiāo liú<br>def: exchange/give-and-take/to exchange/to alternate/communication/alternating current (electricity)<br></div><br>" 

我想回行給出了相同的輸出...任何想法怎麼樣?我認爲通過將它附加到一個全局變量它會做到這一點,但似乎沒有。

+1

競爭條件?在getjson函數完成之前,返回lookup_output。 – Alex

回答

4

您沒有確定範圍問題,您在調用$.getJSON時遇到異步問題。 $.getJSON是一個AJAX調用,「AJAX」中的「A」代表「異步」。當你打電話給$.getJSON時,它會返回你繼續喲lookup_output += "123",然後$.getJSON回調函數會被調用。

通常的做法是增加更多的回調:

function lookupWord(word, callback) { 
    var url = 'http://localhost:3000/jianti/' + word + '.json'; 

    $.getJSON(url, function(data){ 
     var lookup_output = "abc"; 
     $.each(data, function(i, word_data){ 
      lookup_output += "<div> trad: " + word_data.fanti + "<br>"; 
      //... 
     }); 
     lookup_output += "123"; 
     callback(lookup_output);  
    }); 
} 

然後,你會這樣稱呼它:

lookupWord("someword", function(lookup_output) { 
    // Do whatever needs to be done with the result. 
}); 
+0

真棒! – AdamA

+0

@AdamA:再次您好,我認爲頭像看起來很熟悉。 –