//forloop.js
var fs = require('fs');
var files = ['a.txt', 'b.txt', 'c.txt'];
for (var i = 0; i < files.length; i++) {
    fs.readFile(files[i], 'utf-8', function(err, contents) {
        console.log(files[i] + ': ' + contents);
    });
}
为何输出结果为:
undefined: AAA
undefined: BBB
undefined: CCC
改写成forEach
//callbackforeach.js
var fs = require('fs');
var files = ['a.txt', 'b.txt', 'c.txt'];
files.forEach(function(filename) {
    fs.readFile(filename, 'utf-8', function(err, contents) {
        console.log(filename + ': ' + contents);
    });
});
这样结果又对了。。。这是为什么
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
forEach里是个function 里面filename是闭包变量 所以不会变
这个跟js的语法有关,第一个出错,是由于for循环结束之后,fs.readFile的回调函数才会触发,这个时候i==files.length,但是files[files.length]为undefined(对于异步的一些概念可以参考我的文章,js异步解惑)。
第二个正确是由于对于每个forEach循环来说,fs.readFile都是在forEach内部的闭包函数内运行的,对于每个闭包函数来说filename都是闭包内部变量,不相互影响。