局部变量在回调中无效,而其他一些则是

时间:2019-01-31 08:25:35

标签: javascript closures

我试图编写一个小的代码来下载许多文件(在此示例中:一个.json和一个.svg文件),但我偶然发现了一些我不理解的代码。我保证,下次使用Promise时,代码如下:

var path_name = "some/path/to/go";
var item_name = "some_item_to_get";
var load_lst = [
    [server_get_json, "/cdn/json/?m={0}&q={1}".format(path_name, item_name), "m_json", false],
    [server_get_svg, "/cdn/svg/?m={0}&q={1}".format(path_name, item_name), "m_svg", false],
];

var bucket = new Object;

然后,我使用以下代码段启动所有下载,将结果存储在存储桶中并将标志设置为true

for (let i=0 ; i<load_lst.length ; i++) {
    load_lst[i][0](load_lst[i][1], (obj) => {
        console.log(i, load_lst[i][0], load_lst[i][1], load_lst[i][2]);
        bucket[load_lst[i][2]] = obj;
        load_lst[i][3] = true;
    });
}

记录

1 function server_get_svg() /cdn/svg/?m=some/path/to/go&q=some_item_to_get m_svg
0 function server_get_json() /csn/json/?m=some/path/to/go&q=some_item_to_get m_json

这很好。但是下面的一个根本不起作用...相同的函数被调用了两次,通常来说,我的var混合在一起了。

for (let i=0 ; i<load_lst.length ; i++) {
    var [func, url, name, status] = load_lst[i];
    func(url, (obj) => {
        console.log(func, url, name);
        bucket[name] = obj;
        load_lst[i][3] = true;
        console.log(func, url, name, load_lst[0][3], load_lst[1][3]);
    });
}

哪个记录:

function server_get_svg() /cdn/svg/?m=some/path/to/go&q=some_item_to_get m_svg false true
function server_get_svg() /cdn/svg/?m=some/path/to/go&q=some_item_to_get m_svg true true

我不明白为什么在下面的匿名回调中正确知道局部变量i,以及为什么load_lst[i]可以正常工作,但是funcurlnamestatus不会。 如果确实如此,如果我能理解第二个为什么不起作用,我不明白第一个为什么不起作用:)

0 个答案:

没有答案