在JavaScript闭包中更改全局变量

时间:2012-11-21 06:14:17

标签: javascript closures

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

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

这不起作用,因为闭包不会看到myVariable。如何更改此代码以使myVariable的值更改?

2 个答案:

答案 0 :(得分:12)

与您的信念相反,您的代码有效。但看到你正在尝试做什么,并在线之间阅读,我猜你正试图这样做:

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

如果是这样,您需要了解异步功能。

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

请在此处阅读我的回复以获取更多详细信息:JS global variable not being set on first iteration

唯一的好办法是改变您对编码的看法。 (有一个可以说是糟糕的解决方案,涉及将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调用之后编写的任何和所有代码移动到成功回调中。这需要习惯(从互联网上存在这个问题的多少变体来判断)。但是,一旦你习惯它,它就成了第二天性。

这种编程风格有一个名称。它被称为:“事件驱动编程”“延续传递风格”“偶数编程”。如果您想了解更多信息,可以谷歌查看各种条款。

答案 1 :(得分:3)

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

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