2014-09-03 91 views
4

我有以下代码访问:可变变量是从封闭

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); 
      } 
     }); 
    } 

但我的编辑是说“可变变量是关闭访问”。我试图将function(json) {更改为function(json, file) {,但这不起作用,因为这是jquery的默认功能。

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

+0

你已经回答了Mutable变量可以从闭包访问。那么,你尝试使用闭包? – 2014-09-03 07:50:46

+0

相关:http://stackoverflow.com/q/13813463/435605 – 2016-01-14 14:37:45

回答

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); 
      } 
     }); 
    })(); 
} 
+0

谢谢!它现在起作用。 – jan 2014-09-03 07:50:00

+0

不客气。如果您需要进一步解释,请告诉我;) – 2014-09-03 07:51:28

+0

哦,du sprichst sogar Deutsch :) – jan 2014-09-03 07:53:15

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


} 
7

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

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); 
     } 
    }); 
}); 
+0

这些选项比公认的答案更清晰可读 – McGiogen 2016-09-23 10:56:01

3

如果你可以使用ES6,你可以简单地更换varlet,一切按预期工作,因为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); 
      } 
     }); 
    }