Javascript 函数中变量的JS可见性
我使用JSON,我想计算响应中的元素数Javascript 函数中变量的JS可见性,javascript,jquery,ajax,variables,Javascript,Jquery,Ajax,Variables,我使用JSON,我想计算响应中的元素数 $.getJSON("/api/getEvents", function(data) { $.each(data, function(key, event) { var count = 10; $.getJSON("/api/getUsers", function(data) { $.each(data, function(key, event) {
$.getJSON("/api/getEvents", function(data) {
$.each(data, function(key, event) {
var count = 10;
$.getJSON("/api/getUsers", function(data) {
$.each(data, function(key, event) {
alert("Value: " + count);
count++;
});
});
alert("Count: " + count);
});
});
因此,我得到:
Value: 10
Value: 11
Value: 12
...
Count: 10
为什么计数为10?这是因为ajax请求是异步的
$.getJSON
只是启动一个请求,但javascript执行会立即继续。如果在ajax回调中移动警报,则可以看到计数:
$.getJSON("/api/getEvents", function(data) {
$.each(data, function(key, event) {
var count = 10;
$.getJSON("/api/getUsers", function(data) {
$.each(data, function(key, event) {
alert("Value: " + count);
count++;
});
// I moved this here:
alert("Count: " + count);
});
// It used to be here.
});
});
因此,在设置
var count=10
之后,javascript解析器会运行$.getJSON
,但随后会立即转到下一行,在您的代码示例中,该行会提醒“count:10”。然后,每当请求完成时,它都会运行回调代码以增加计数并提醒值
行。我不太确定,这就是为什么我不将此作为答案发布的原因,但我相信在$.getJSON中可以创建一个闭包,它只捕获对变量计数的引用。在我看来,来自getUsers
调用的data
是一个空数组。您将计数设置为10,然后将其递增0倍,然后它将通知计数:10。@BenLee不,数组不是空的。我可以从数据中得到元素的值。当你说“因此,我得到…”时,“你得到”是什么意思?这是控制台输出吗?警报?“Value:…”行从哪里来——我在代码中什么地方都看不到?@BenLee抱歉,解析器吃了这行。警报。我一开始也是这么想的,但问题是警报并不是你说的那样。它实际上已经在getJSON回调中。@Joi,这是问题中的一个错误。在我问他“价值”线是从哪里来的之后,OP解决了这个问题。