2012-07-06 45 views
0

Latey我有一些奇怪的JavaScript行爲有些麻煩。我想要這樣做:奇怪的JavaScript範圍行爲

var lang = null; 

function getLang() { 
    if (browserLanguageIsGerman) { 
     lang = 'de'; 
    } 
    else { 
     lang = 'en'; 
    } 
    // alert(lang) shows "de" 

    $('#someID').load(someValidUrl, null, 
     function(response, status, xhr) { 
      if(languageSettingsOnFacebookIsGerman) { 
       lang = 'de'; 
      } 
      else { 
       lang = 'en'; 
      } 
      // alert(lang) show "en" 
    ); 
    // alert(lang) shows "de" 
} 

第一個和第二個警報顯示了擴展值1)「de」2)「en」。第三個提示顯示「de」,但不應該是「en」? 第三次提醒後,還會彈出第二次提醒。

有人可以在我心中明顯的錯誤嗎? :)

在此先感謝!

+5

您正在使用AJAX。請記住,AJAX是異步的! – antyrat 2012-07-06 13:00:44

+2

警報只是增加了更多的混淆,因爲它們可以阻止執行線程足夠長的時間,以便ajax響應回來。將ajax與警報調試混合在一起,是扭轉對發生事件的理解的一種肯定方式。 – Esailija 2012-07-06 13:04:02

+1

我們應該找出一些事情,因爲我們每天都會多次得到同樣的問題。 – kapa 2012-07-06 13:05:13

回答

8

這不是範圍問題。 load方法是異步的。在您傳遞給load的回調之前執行第三個alert。將取決於該異步調用結果的任何代碼移動到回調中。您也可以查看jQuery deferred objects API。請注意,如果您要使用延遲對象API,則需要更改致電load致電jQuery.getjQuery.ajax,因爲.load返回jQuery的實例,該實例未實現Promise接口。

+3

...或使用[.then()](http://api.jquery.com/deferred.then/)(或其等價物)代替。 – raina77ow 2012-07-06 13:02:21

+0

...或使用同步請求。 (將異步設置爲false:http://api.jquery.com/jQuery.ajax/) 編輯:不這樣做。 – Roman 2012-07-06 13:05:32

+1

@roman - 不要這樣做。它將從jQuery 1.8開始被棄用。 – 2012-07-06 13:07:32

0

不,它不應該。 「加載」不會等待來自「someValidUrl」的信息將被提取。相反,它會推遲你的內部函數在信息可用時立即執行,並立即返回而不用等待。它被稱爲「異步」。