我收到了这条评论:
在处理传入数据时Node.js的服务器端,如果你想使用for
循环,你必须在匿名函数中创建i
,否则你会想知道如何你的变量i
是否大于限制它在你的循环中的变量。
以下是推荐的错误修正:
var i = 0,
len = that.users.length;
(function(i) {
while(i < len) {
console.log(' - - - - - debug - - - - -');
console.log('i = ' + i );
i++;
}
})(i);
有人可以向我解释为什么使用匿名函数是必要的吗?
答案 0 :(得分:1)
只有在循环中有异步代码时才会出现问题。例如(为简单起见,我改为for循环):
var i = 0,
len = that.users.length;
for(i = 0;i < len;i++) {
setTimeout(function() {
console.log('i = ' + i );
}, 500);
}
您会发现运行此代码会导致len
的值打印len
次,而不是最多len
。这是因为for循环在任何print语句运行之前完成,因此循环已退出,因为i == len
。
对此的修复是使用立即调用的函数表达式(IIFE)将i
锁定到每个值:
var i = 0,
len = that.users.length;
for(i = 0;i < len;i++) {
(function(i) {
setTimeout(function() {
console.log('i = ' + i );
}, 500);
})(i);
}
这不完全是你提出的错误修正,但它是我能想到的最接近的错误。鉴于更多的背景,我可以更加确定它应该解决的问题。