Javascript 函数中变量的JS可见性

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) {

我使用JSON,我想计算响应中的元素数

    $.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解决了这个问题。