变量在内部函数中不可写

时间:2012-05-10 12:21:34

标签: javascript jquery firefox variables firebug

$(document).ready(function() {
    state = 0;
    $('#btnlogin').click(function() {
        $.post("php/redirect.php", {
            Username : $('#qi').attr('value'),
            Password : $('#password').attr('value')
            }, function(data) {
            console.log('first'+state);
            state = 3;
            console.log('second'+state);
        });
        console.log('third'+state);
    });
});

首先,我声明了一个全局变量并将其设置为0。
在内部函数中我想将var设置为另一个值,但是我的输出不会在(全局)外部var中设置,它将被设置为本地var。我的另一个问题是我获得输出的顺序。

输出:

third0<br>
first0<br>
second3<br>

3 个答案:

答案 0 :(得分:1)

这是因为console.log('third'+state);$.post(AJAX)调用之外并且调用比ajax响应更快。

似乎你误解了AJAX 异步

答案 1 :(得分:1)

问题是当邮件调用从服务器返回时,$.post调用的内部函数将首先运行。

因此,当单击按钮时,程序流将如下所示:

$.post("php/redirect.php",这将调用服务器端的redirect.php方法,并在调用完成时调用以下函数:

function(data) {
  console.log('first'+state);
  state = 3;
  console.log('second'+state);
}

然后该函数继续并运行以下代码:

console.log('third'+state);

此时,状态仍为0,因此输出为third0

然后ajax调用完成,并调用上面的函数,从而输出以下内容:

first0
second3

你的问题只是期望你方法中的行,包括你在里面定义的函数以它们在你的脚本中出现的顺序运行。

答案 2 :(得分:0)

输出很简单:

加载文档后,首先将点击处理程序绑定到某个按钮。点击处理程序以下列方式工作:

  • 启动异步 AJAX调用
  • 退出'third'+state

此时状态为0,因此第一个输出为third0

一段时间后,AJAX请求成功了,你得到了答案。得到答案时,请记录'first'+state。如果state仍为0,则会获得输出first0

之后,您将state的值更改为3,并将第三个输出更改为second3

因此,要了解行为,您应该熟悉AJAX的异步版本或将请求更改为同步样式。后者非常糟糕,因为它会在请求仍在运行时使您的页面无法访问。