0

我收到了这样的评论:

在 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);

有人可以向我解释为什么需要使用匿名函数吗?

4

1 回答 1

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.

i解决此问题的方法是使用立即调用函数表达式 (IIFE)锁定每个值:

var i = 0,
len = that.users.length;

for(i = 0;i < len;i++) {
  (function(i) {
    setTimeout(function() {
      console.log('i = ' + i );
    }, 500);
  })(i);
}

这不完全是您提出的错误修复,但它是我能想到的最接近的,这很有意义。考虑到更多的上下文,我可以更确定它应该解决什么问题。

于 2013-10-04T02:59:08.683 回答