关于 JavaScript 变量作用域的问题

Posted

技术标签:

【中文标题】关于 JavaScript 变量作用域的问题【英文标题】:Question about JavaScript variable scope 【发布时间】: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); )

非常感谢您的贡献!

【问题讨论】:

【参考方案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

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

【讨论】:

以上是关于关于 JavaScript 变量作用域的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于JavaScript编译原理以及作用域的深入探讨

ES6里关于作用域的拓展:块级作用域

javascript 作用域的问题

作用域链

关于python函数形参实参和变量作用域的分析

关于JavaScript的作用域你应该了解的那点事!