javascriptで「ローカル」変数を使用する場合の問題は、JavaやC#などのように、変数がブロックスコープではなく実際に関数スコープを持っていることです。
これを回避する1つの方法はlet
、ブロックスコープを持つを使用することですが、現在、Firefoxのみがこれをサポートしています。
したがって、このコードはFirefoxでのみ機能します。
for (var x in files) {
// This variable has BLOCK scope
let file = files[x];
asynchronousFunction(var1, var2, function(){
console.log(file.someVariable);
});
}
他のブラウザの場合、代替手段はクロージャを使用することです
for (var x in files) {
var file = files[x];
asynchronousFunction(var1, var2, (function(file){
return function() {
console.log(file.someVariable);
};
})(file);
}
これを行う別の方法は、ファイルのデータ型が配列であると想定して、map/forEachを使用することです。
files.forEach(function(file) {
asynchronousFunction(var1, var2, function(){
console.log(file.someVariable);
});
});
配列でない場合は、いつでもこの手法を使用できます
[].forEach.call(files, function(file) {
asynchronousFunction(var1, var2, function(){
console.log(file.someVariable);
});
});
これを書くためのより完全な方法はもちろんです
Array.prototype.forEach.call(files, function(file) {
// As before
しかし、私[].forEach
は目にはより良いと感じています。