一、问题
今天工作中解决bug发现是由“for循环的异步函数,回调引用的循环值始终是最后的值”的现象导致的,如:
for (var i = 0; i < files.length; i++) {
var itemFile = files[i];
fs.stat("./uploads/" + itemFile, function (err, stats) {
if (stats.isDirectory()) {
console.log(itemFile+i);
} else {
console.log(2);
}
});
}
输出结果是:
wedding3
wedding3
wedding3
二、解决方法
通过自执行函数传参(匿名函数),这样就形成了不受外界变量影响的局部作用域,如:
for (var i = 0; i < files.length; i++) {
(function(i){
var itemFile = files[i];
fs.stat("./uploads/" + itemFile, function (err, stats) {
if (stats.isDirectory()) {
console.log(itemFile+i);
} else {
console.log(2);
}
});
})(i);
}
输出得到:
cat0
dog1
wedding2
三、其他
前端页面开发也会碰到类似的问题,比如setTimeout异步执行的问题,在前端可以通过jquery的each方案解决。用jQuery的 $.each(),自带回调函数,形成了函数作用域.
<script type="text/javascript">
var arr = ["dog",cat","wedding"];
$.each(arr, function(key, value) {
setTimeout(function() {
console.log(key);
console.log(value);
}, 2000);
});
</script>