我有以下代码:
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的默认函数。
我希望你能帮我解决问题。
答案 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);
}