5

我正在尝试更改闭包中变量的值:

var myVariable;
$.ajax({
    //stuff....
    success:function(data) {
        myVariable = data;
    }
});

这不起作用,因为myVariable闭包不可见。如何更改此代码以使值myVariable更改?

4

2 回答 2

13

与您的看法相反,您的代码有效。但是看到你正在尝试做的事情并在字里行间阅读我猜你正在尝试这样做:

var myVariable;
$.ajax({
    //stuff....
    success:function(data) {
        myVariable = data;
    }
});
alert(myVariable); // at this point myVariable is undefined!!

如果是这样,您需要了解异步函数。

基本上,该$.ajax()函数在实际提交 ajax 请求之前返回。当浏览器不忙于执行 javascript 时,它将稍后执行 ajax 请求。这意味着当您尝试提醒 的值时,分配还没有发生myVariable

在此处阅读我的回复以获取更多详细信息:JS 全局变量未在第一次迭代时设置

唯一好的解决方案是改变你对编码的看法。(有一个可以说是糟糕的解决方案,涉及将 ajax 调用转换为同步,但我们不要介入,如果需要或阅读手册,您可以谷歌搜索)。而不是这样做:

var myVariable;
$.ajax({
    //stuff....
    success:function(data) {
        myVariable = data;
    }
});
/*
 * Do lots of stuff with the returned value
 * of the myVariable variable
 *
 */

你现在需要这样写:

var myVariable;
$.ajax({
    //stuff....
    success:function(data) {
        myVariable = data;
        /*
         * Do lots of stuff with the returned value
         * of the myVariable variable
         *
         */
    }
});

基本上将您在 ajax 调用之后编写的所有代码移动到成功回调中。这需要习惯(从互联网上有多少这个问题的变体来判断)。但是一旦你习惯了它,它就会变成你的第二天性。

这种编程风格有一个名字。它被不同地称为:“事件驱动编程”“继续传递风格”“事件编程”。如果您想了解更多信息,可以搜索各种术语。

于 2012-11-21T06:26:45.097 回答
3

如果该代码在全局范围内,则 myVariable内部函数可见。如果您担心它被局部变量遮蔽,请将其作为全局属性显式访问:

var myVariable;
$.ajax({
    //stuff....
    success:function(data) {
        window.myVariable = data;
    }
});
于 2012-11-21T06:19:33.127 回答