2012-11-21 96 views
5

我试图改变一个封闭一个变量的值内:更改全局变量的JavaScript关闭

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

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

+1

这是不正确的。根据定义,如果它是全球性的,它可以在所有范围内访问。当然,如果有一个名为'myVariable'的局部变量,那么它将被修改而不是全局版本。如果它真的是全球性的,你可以使用'window.myVariable'来访问它。 – mowwwalker

+1

您的示例不显示为什么它在成功回调的范围内不可见。唯一会隐藏它的就是在一个更近的范围内存在一个具有相同名称的变量,并将其遮蔽。 –

+0

嗯,我认为这个变量没有变,因为ajax不是同步的。不知道如何使它同步,虽然 – user1811367

回答

11

相反,你的信念,你的代码工作。但看到你想要做什么,我猜你正在试图做到这一点的字里行间:

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调用到成功回调后已撰写的任何和所有代码。这需要习惯(从互联网上存在多少个这个问题的变体来判断)。但一旦你习惯了它,它就成为第二天性。

这种风格的编程有一个名称。它有各种不同的名称:“事件驱动编程”“延续传球风格”“编程编程”。如果你想知道更多,你可以谷歌的各种条款。

+0

这可能会成为问题的核心,尽管很难说明给出的解释。 – tjameson

+0

@tjameson:根据我的经验,无论什么时候有人试图将回调的结果赋值给一个封闭变量,那么它很可能就是问题所在。回答关于这个问题足够长的时间,你可以看到问题的模式。 – slebetman

3

如果该代码在全局范围内,myVariable 对内部函数可见。如果你担心它被一个局部变量的阴影,明确地访问它作为全球的一个属性:

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