2014-09-03 93 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); 
      } 
     }); 
    }