关于 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 变量作用域的问题的主要内容,如果未能解决你的问题,请参考以下文章