可以通过闭包访问可变变量

时间:2014-09-03 07:39:59

标签: javascript jquery json variables

我有以下代码:

for (var i = 0; i < data.length; i++) {
        var file = data[i];
        $.getJSON("/types/" + file, function(json) {
            if (json[0] !== undefined) {
                console.log(json[0] + file);
            }
        });
    }

但是我的编辑说“可以从闭包中访问Mutable变量”。我尝试将function(json) {更改为function(json, file) {,但这不起作用,因为这是jquery的默认函数。

我希望你能帮我解决问题。

4 个答案:

答案 0 :(得分:17)

对于这样的循环,您需要将内容放在闭包中。

for (var i = 0; i < data.length; i++) {
    (function(){
        var file = data[i];
        $.getJSON("/types/" + file, function(json) {
            if (json[0] !== undefined) {
                console.log(json[0] + file);
            }
        });
    })();
}

答案 1 :(得分:9)

你可以按照建议使用闭包,也不会让你的代码更容易阅读,特别是如果你的闭包在一个循环中!简单地创建一个函数并在每次迭代时调用它会更容易和更简洁。

for (var i = 0; i < data.length; i++) {
    doJson(data[i]);
}

function doJson(file) {
    $.getJSON("/types/" + file, function(json) {
        if (json[0] !== undefined) {
            console.log(json[0] + file);
        }
    });
}

或者您可以简单地更新循环以使用forEach,因为每次迭代都会触发一个新函数,范围将仅限于此。

data.forEach(function(file) {

    $.getJSON("/types/" + file, function(json) {
        if (json[0] !== undefined) {
            console.log(json[0] + file);
        }
    });
});

答案 2 :(得分:3)

如果您可以使用ES6,则只需将var替换为let,一切都按预期工作,因为let会在for循环的每次迭代中创建一个新范围。

for (let i = 0; i < data.length; i++) {
        var file = data[i];
        $.getJSON("/types/" + file, function(json) {
            if (json[0] !== undefined) {
                console.log(json[0] + file);
            }
        });
    }

答案 3 :(得分:2)

你应该使用闭包:(在循环中运行函数时要小心)。

for (var i = 0; i < data.length; i++)
{
    var file = data[i];

    (function(f)
    {

        $.getJSON("/types/" + f, function(json)
        {
            if (json[0] !== undefined)
            {
                console.log(json[0] + f);
            }
        })
    })(file);


}