【问题标题】:Question about JavaScript variable scope关于 JavaScript 变量作用域的问题
【发布时间】:2011-10-02 00:13:28
【问题描述】:

谁能告诉我为什么这个提醒是空的?

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 函数之外的数组中。

感谢您的贡献。

编辑

感谢您的 cmets,此代码可以正常工作:

    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); })

非常感谢您的贡献!

【问题讨论】:

    标签: javascript jquery variables scope each


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答,但恐怕它不起作用。还有其他想法吗?
    • 变量定义和警报在同一个范围内,所以这个建议与问题无关。
    【解决方案2】:

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

    【讨论】:

    • 可能性不大。是的,这是可能的,但所描述的问题是由于 ajax 调用的异步性质造成的。
    【解决方案3】:

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

    但是,发生这种情况时,可能尚未收到来自异步调用的响应,因此可能未填充 pending_dates

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        $.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
        }
        

        有了它,您将能够处理获得的所有可用数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-12-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多