函数中变量的JS可见性

JS visibility of a variable in function

本文关键字:JS 可见性 变量 函数      更新时间:2023-09-26

我使用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,但随后会立即进入下一行,在您的代码示例中,这会提醒"计数:10"。然后,每当请求完成时,它都会运行回调代码,以增加计数并提醒Value行。