2012-06-12 41 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编程和一般异步编程的难点:同时存在大量球,很难推断他们如何完成操作,以及何时可以看到结果。

这很容易联想到$阿贾克斯()调用中的“从服务器得到的结果”,但它是真的,“向服务器发送请求。”谁知道什么时候可以完成?