【问题标题】:variable not writable in inner function变量在内部函数中不可写
【发布时间】:2026-01-07 06:50:01
【问题描述】:

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

输出:
第三0
第一个0
秒3

$(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);
    });
});

【问题讨论】:

  • 考虑到异步ajax任务,输出的顺序是正确的。您能否进一步解释第一个问题(或与此问题有关)?
  • @F.Calderan 是正确的,顺序是正确的 - 您期望的顺序是什么?
  • 是的,现在我明白了,但这背后是我真正的问题;)请看看我对下一个答案的其他评论。谢谢

标签: javascript jquery firefox variables firebug


【解决方案1】:

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

您似乎误解了 AJAX 是异步

【讨论】:

  • 哦,是的,我忘了^^我希望点击返回真或假取决于ajax请求的返回
【解决方案2】:

你的问题是,当 post 调用从服务器返回时,$.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

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

【讨论】:

  • 好的,谢谢,现在我明白了;)但我真正的问题是我想根据 ajax 请求的输出从点击处理程序返回 true 或 false。 var问题导致我对ajax的理解缺失^^
【解决方案3】:

输出解释起来真的很简单:

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

  • 开始异步 AJAX 调用
  • 注销'third'+state

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

一段时间后,AJAX 请求成功,您得到了答案。获得答案时,您会记录 'first'+state。在state 仍然是0 的情况下,您将获得输出first0

然后将state 的值更改为三和第三个输出,这将得到second3

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

【讨论】:

    最近更新 更多