我正在尝试更改闭包中变量的值:
var myVariable;
$.ajax({
//stuff....
success:function(data) {
myVariable = data;
}
});
这不起作用,因为闭包不会看到myVariable
。如何更改此代码以使myVariable
的值更改?
答案 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;
}
});