Javascript中的全局变量未更新

Javascript中的全局变量未更新,javascript,Javascript,我花了30分钟才弄明白 让我们假设以下情况: <script> var x = 0 ; //global variable function compute() { x = x+1; } </script> 我希望能够在以后的函数中访问id1和id2的值(自从我将它们声明为0以来已更新) 但是,该值保持为零,并且可以很好地检索数据1 您确定在成功回调运行后正在检查id1的值吗ajax是一个异步操作,在服务器返回响应之前不会调用您

我花了30分钟才弄明白

让我们假设以下情况:

<script>
    var x = 0 ; //global variable
    function compute() {
        x = x+1; 
    }
</script>
我希望能够在以后的函数中访问id1和id2的值(自从我将它们声明为0以来已更新)


但是,该值保持为零,并且可以很好地检索数据1

您确定在
成功
回调运行后正在检查
id1
的值吗
ajax
是一个异步操作,在服务器返回响应之前不会调用您的回调。

我不知道您何时尝试使用ID,但ajax调用是异步的,因此如果您尝试这样读取变量:

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,则必须在成功回调中或在成功回调中调用的函数中使用ID。

ajax回调是异步的。在远程服务器响应之前,它不会运行
success
功能。一旦它执行了,您的函数就会被执行,并且变量会递增

这是Javascript编程和异步编程中的一个难点:一次有许多球在空中,很难推断它们可能如何完成操作,以及何时可以看到结果


很容易将$.ajax()调用视为“从服务器获取结果”,但实际上是“向服务器发出请求”。谁知道它可能会在何时完成?

如果不使用第二个参数指定基数,请不要调用
parseInt
。我想你申报id1和id3,然后你要id2?未定义的异常将被抛出,数据检索正常。问题不在parseInt上。@TrinhHoangNhu我看到并纠正了这一点。SorryOkay我可以不将其分配给全局变量并使用它吗?@DpkgMe好的,您可以将其分配给全局变量,但是如果您尝试在成功回调之外读取该全局变量,则该变量可能尚未设置,因为此时数据尚未返回。这就是为什么要使用success回调函数,以便在使用它之前知道您已经拥有了数据。上面的情况似乎是可能的,但它假设id1和id2与尝试调用它们的任何函数在同一范围内。从这个片段来看,它们似乎是全局的。但是,如果此代码存在于某种包装函数中,则需要确保调用例程在相同的范围内。我正在使用pusher,并将在pusher触发器内发送ID。谢谢大家。@jatrim谢谢澄清,我只是假设它们没有被另一个函数包装,因为OP说它们是gobal。
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