Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中变量作用域的混淆_Javascript_Jquery - Fatal编程技术网

javascript中变量作用域的混淆

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){

我在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){
                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的非阻塞性:)非常感谢。回答得很好。在每次功能完成后,警报是否会立即正常工作?就像第一个例子一样