javascript中变量范围的混淆

时间:2012-12-28 15:36:24

标签: 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){
                values.push(v);
            });
            alert(values[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]);
}

是否由于某些闭合构造形成?还是我缺少一些基本概念?只是好奇地知道为什么即使我将数组声明为全局,也不会警告值。请详细说明。

2 个答案:

答案 0 :(得分:16)

问题不在于范围。

问题是您正在进行AJAX调用,然后在AJAX调用完成之前立即继续执行下一个语句。

因此,在从AJAX调用填充数组之前,您alert(values[1]);

答案 1 :(得分:3)

这将修复它,使用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]); });
}