关于JavaScript变量范围的问题

时间:2011-07-09 20:19:26

标签: javascript jquery variables scope each

有人可以告诉我为什么这个警报是空的吗?

var pending_dates = [];
$.getJSON('/ajax/event-json-output.php', function(data) {
    $.each(data, function(key, val) {
    pending_dates.push({'event_date' : val.event_date});
    });
});
alert(pending_dates);

我无法理解这一点。我不是将pending_dates声明为全局变量,可以在每个循环中访问吗?如何解决这个问题?

请注意,JSON输出效果很好。如果我在getJSON function内声明待定日期(以及该函数中的警报),它可以工作,但我需要将数据存储在getJSON函数之外的数组中。

感谢您的贡献。

修改

感谢您的评论,此代码正在运行:

    pending_dates = [];
    $.getJSON('/ajax/event-json-output.php', function(data) {
        $.each(data, function(key, val) {
            pending_dates.push({'event_date' : val.event_date});
        });
    }).success(function() { alert(pending_dates); })

非常感谢您的贡献!

5 个答案:

答案 0 :(得分:4)

我认为问题是$.getJSON是异步调用 - 它立即返回,然后调用alert(pending_dates)

然而,当发生这种情况时,可能没有收到异步调用的响应,因此可能没有填充pending_dates

这可能是为什么在调用alert(pending_dates)时它为空的原因。

答案 1 :(得分:3)

在JSON调用完成之前,您的警报正在执行。记住它以异步方式获取和处理的这个JSON,但是在它启动后立即发出警报。如果你想要一个警报,那么你需要把它放在getJSON调用完成时。

答案 2 :(得分:2)

$.getJSON异步工作意味着您在回调中指定的任何内容最终都会被执行,但无法保证在您到达alert('pending_dates')时会发生。

您可以在左后方移动alert('pending_dates')来验证这一点 pending_dates.push()(这会导致为其检索的每个项目显示一条警报。)

您可以编写一个函数,以便在可用时立即开始处理您正在检索的数据:

var pending_dates = [];
$.getJSON('/ajax/event-json-output.php', function(data) {
    $.each(data, function(key, val) {
        pending_dates.push({'event_date' : val.event_date});
        doSomething(val.event_date);
    });
});

function doSomething(date) {
    // do something with date
    // like writing it to the page
    // or displaying an alert
}

通过这种方式,您将能够处理所有可用的数据。

答案 3 :(得分:-2)

默认情况下,变量在Javascript中是全局的 - var实际上引入了范围。删除它,看看它是否有帮助。

答案 4 :(得分:-2)

AJAX响应更有可能不返回任何数据。您是否可以尝试仅将'foo'推送到阵列上,并查看警报是否显示不同的内容?