在 javascript 中使用“本地”变量的问题在于您的变量实际上具有函数范围,而不是块范围 - 就像 Java 和 C# 等一样。
解决此问题的一种方法是使用let
which has block scope,但目前只有 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
眼睛更好看。