可变variables可以从闭包访问

我是新来的JavaScript。 这是我的代码

...... var filename, result, user=["a", "b", "c","d"]; for(var p=0;p<user.length;p++) { filename=userID[p]+'_'+user[p]+'.json'; fs.readFile(filename, function read(err, data) { if (err) {throw err;} result = data.toString(); if (result.charAt(result.length-1) === ',') result = result.substring(0,result.length-1) + ']}'; console.log(p+filename+result+"\n\n"); //here }); } 

在“here”中,p的值始终显示最后一个索引,在这种情况下,对于所有迭代,文件名是最后一次迭代。如何在“here”中获得p的正确值。 对于我的编译器显示“可变的variables是从闭包访问”。

@naomik评论似乎对任何在循环体内的asynchronous工作总是不好的想法。 因为循环不会等到响应。

 var filename, result, user=["a", "b", "c","d"]; var p=0; function readfileUnitil(p) { filename=userID[p]+'_'+user[p]+'.json'; fs.readFile(filename,function(err, data) { if (err) {throw err;} result = data.toString(); if (result.charAt(result.length-1) === ',') result = result.substring(0,result.length-1) + ']}'; console.log(p+filename+result+"\n\n"); //here if(p<user.length){ p++; readfileUnitil(p); } }); } } 

我更喜欢这种recursion,而不是让variables,因为这是更具可读性和内存不会由浏览器希望有帮助。

在这种情况下, filename范围是for loop块, filename值已经绑定到fs.readFile 。 简单的方法来解决这个问题,请按照代码块

 var filename, result, user = ["a", "b", "c", "d"]; for (var p = 0; p < user.length; p++) { filename = userID[p] + '_' + user[p] + '.json'; (function(file) { fs.readFile(filename, function read(err, data) { if (err) { throw err; } result = data.toString(); if (result.charAt(result.length - 1) === ',') result = result.substring(0, result.length - 1) + ']}'; console.log(p + filename + result + "\n\n"); //here }); })(filename) }