2012-06-12 70 views
0

我花了最後30分鐘來解決這個問題。Javascript中的全局變量沒有更新

假設下面的情況:

<script> 
    var x = 0 ; //global variable 
    function compute() { 
     x = x+1; 
    } 
</script> 

如果x的值遞增,所以我可以訪問它變成一個功能以後?

我有以下代碼:

var id1 = 0; 
var id2 = 0; 
$.ajax({ 
    url: "http://localhost/twee/chat/comment", 
    type: 'POST', 
    data: form_data, 
    success: function(data) { 
     var data1 = parseInt(data); 
     id1 = id2 = data1; 
    } 
}); 

我希望能夠在以後的函數來訪問ID1和ID2(因爲我宣佈他們爲0更新)的值。

但是,值保持爲零,data1檢索得很好。

+0

不要在沒有用第二個參數指定基礎的情況下調用'parseInt'。 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/parseInt – Quentin

+0

我說你聲明id1和id3然後你問id2?未定義的異常將被拋出 –

+0

數據檢索得很好。問題不在於parseInt。 –

回答

0

你確定你的success回調運行後檢查id1價值? ajax是一個異步操作,您的回調將不會被調用,直到響應從服務器返回。

2

我不知道,當你嘗試使用的ID,但Ajax調用asynchronus,因此,如果您嘗試讀取變量是這樣的:

var id1 = 0; 
var id3 = 0 ; 
$.ajax({ 
     url: "http://localhost/twee/chat/comment", 
     type: 'POST', 
     data: form_data, 
     success: function(data) { 
       var data1 = parseInt(data, 10); 
      id1 = id2 = data1; 

     alert(id1) // Will alert whatever number returned as data. 
}}); 

alert(id1) // Will alert 0 

第二警報將與幾乎同時叫ajax調用,那時數據還沒有被更新,而第一個警報將不會被調用,直到數據返回。如果您打算使用ID,則必須在成功回調中或在成功回調中調用的函數中使用它們。

+0

好吧我可以不把它分配給一個全局變量並使用它? –

+0

@DpkgMe那麼,你可以把它分配給一個全局變量,但是如果你試圖在成功回調之外讀取這個全局變量,那麼這個變量可能還沒有被設置,因爲數據還沒有返回那一點。這就是爲什麼你使用成功回調,以便在使用之前知道你有數據。 –

+0

上面看起來很可能,但它假定id1和id2與任何函數試圖調用它們的範圍相同。從這個片段看來,它們似乎是全球性的。但是,如果此代碼存在於某種封裝函數中,則需要確保調用例程位於相同範圍內。 – jatrim

0

您的ajax回調是異步的。直到遠程服務器響應之後,它纔會運行success函數。一旦它完成,你的函數被執行,並且變量增加。

這是Javascript編程和一般異步編程的難點:同時存在大量球,很難推斷他們如何完成操作,以及何時可以看到結果。

這很容易聯想到$阿賈克斯()調用中的「從服務器得到的結果」,但它是真的,「向服務器發送請求。」誰知道什麼時候可以完成?