javascript中变量作用域的混淆
我在js中有一个函数,它用从服务器脚本获取的json值填充全局数组:javascript中变量作用域的混淆,javascript,jquery,Javascript,Jquery,我在js中有一个函数,它用从服务器脚本获取的json值填充全局数组: function populateValues(id) { var values=new Array(); $.getJSON( '<?PHP echo base_url();?>admin/forums/getForumById/' + id , function(data){ $.each(data,function(k,v){
function populateValues(id) {
var values=new Array();
$.getJSON(
'<?PHP echo base_url();?>admin/forums/getForumById/' + id ,
function(data){
$.each(data,function(k,v){
values.push(v);
});
alert(values[1]);
}
);
}
函数populateValues(id){
var值=新数组();
$.getJSON(
“admin/forumbyd/”+id,
功能(数据){
$。每个(数据、函数(k、v){
推送(v);
});
警报(值[1]);
}
);
}
这可以正常工作,并警告所需的值。但是,当我在循环后尝试发出警告时,值丢失,我得到一个未定义的值。情况如下:
function populateValues(id) {
var values=new Array();
$.getJSON(
'<?PHP echo base_url();?>admin/forums/getForumById/' + id ,
function(data){
$.each(data,function(k,v){
values.push(v);
});
}
);
alert(values[1]);
}
函数populateValues(id){
var值=新数组();
$.getJSON(
“admin/forumbyd/”+id,
功能(数据){
$。每个(数据、函数(k、v){
推送(v);
});
}
);
警报(值[1]);
}
这是由于某种封闭结构形成的吗?还是我缺少的一些基本概念?只是想知道为什么即使我将数组声明为全局数组,这些值也不会发出警报。请解释一下。问题不在范围之内 问题是您正在进行一个AJAX调用,然后在AJAX调用完成之前立即继续执行下一条语句
因此,您需要
警报(值[1])代码>从AJAX调用填充数组之前。这将使用AJAX调用返回的Promise对象修复它:
function populateValues(id)
{
var values=new Array();
$.getJSON('<?PHP echo base_url();?>admin/forums/getForumById/'+id,function(data){
$.each(data,function(k,v) {
values.push(v);
});
}).done(function() { alert(values[1]); });
}
函数populateValues(id)
{
var值=新数组();
$.getJSON('admin/forums/getForumById/'+id,函数(数据){
$。每个(数据、函数(k、v){
推送(v);
});
}).done(函数(){alert(值[1]);});
}
问题不在于作用域,而在于异步性。但当我尝试在循环后发出警报时,在两个示例中,您的警报都在循环之外。唯一的区别是示例1在get
内部,而示例2在外部,因此存在异步性问题。@FrançoisWahl Correct!抱歉,我说的循环是指ajax构造。这是由于js的非阻塞性:)非常感谢。回答得很好。在每次功能完成后,警报是否会立即正常工作?就像第一个例子一样