var fs = require(‘fs’); var stdin = process.stdin, stdout = process.stdout; fs.readdir(process.cwd(), function (err,files) { var i = 0; console.log(files); while (i < files.length) { // file(i); //为什么必须封装到函数里,输出才是正确的? … var fn = files[i]; fs.stat(__dirname + ‘/’ + fn, function (err, stat) { if (stat.isDirectory()) { console.log(i + “.” + fn + “目录.”); } else { console.log(i + “.” + fn);
}
//...................................................
});
i++;
}
function file(i) {
var fn = files[i];
fs.stat(__dirname + '/' + fn, function (err, stat) {
if (stat.isDirectory()) {
console.log(i + "." + fn + "目录.");
}
else {
console.log(i + "." + fn);
}
});
}
});
自己顶
不然的话,出什么错误?
错误输出: 正确输出:
@leapon 看我楼下的图片
错误原因是变量 i 被循环改了,fs.stat 的回调函数执行的时候,i 都变成 9 了。
@leapon 循环执行比回调函数快?所以以后写回调函数的时候,最好封装成一个函数?
不封装到函数的话,在fs.stat的callback中的i是对i的引用,因此实际用到的时候值已经变成9了。如果封装成函数,那么函数中的i是在调用此函数时的值,也就是从0-8都有。 楼主可以进一步看看关于Closure的东东: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures#Creating_closures_in_loops.3a_A_common_mistake
@SevenSharp 函数有scope,和执行快慢无关。你多看看 function scope,closure 方面的文章吧。