Javascript循环引用

Javascript循环引用,javascript,node.js,loops,Javascript,Node.js,Loops,可能重复: 我在node.js中编程,遇到了一个小问题,这是由一些奇怪的按引用传递问题引起的 我使用以下代码: for(j in groups){ console.log(j, somefunction(groups[j])) } 在函数内部,对数据进行了一些奇怪的操作,但之后我得到了以下结果: 3 data 3 data 3 data 3 data 3 data 3 data 而不是 1 data 2 data 3 data 4 data 5 data 6 data 但是它保持了正

可能重复:

我在node.js中编程,遇到了一个小问题,这是由一些奇怪的按引用传递问题引起的

我使用以下代码:

for(j in groups){
  console.log(j, somefunction(groups[j]))
}
在函数内部,对数据进行了一些奇怪的操作,但之后我得到了以下结果:

3 data
3 data
3 data
3 data
3 data
3 data
而不是

1 data
2 data
3 data
4 data
5 data
6 data
但是它保持了正确的结果量。

我发现如果我使用 var j=0

for(i in groups){
j = i

这个系统是如何工作的,但它不是最好的,因为你引用的代码没有做到你所列出的,你可能失去了一些简化问题的东西

但是,此代码会产生您所描述的效果:

for(j in groups){
  doSomething(function() {
    // Callback for `doSomething`
    console.log(j, somefunction(groups[j]));
  });
}
请注意,现在我正在创建一个函数(回调
doSomething
所做的任何事情),而不仅仅是调用一个函数

发生这种情况的原因是,正在创建的函数具有对
j
变量(以及执行上下文中的所有其他变量)的持久引用,而不是创建函数时的副本。它被称为执行上下文上的闭包。因此,循环运行时,对
doSomething
的一系列调用会启动一系列操作,然后在调用回调时,
j
为3,因此所有调用都是相同的

通常的解决方案是创建一些函数,这些函数关闭在被调用之前不会更改的对象,如下所示:

for(j in groups){
  doSomething(makeCallback(j));
}

function makeCallback(jarg) {
    return function() {
        console.log(jarg, somefunction(groups[jarg]));
    };
}
现在,我们在回调中使用了
jarg
,而不是
j
。因为
jarg
是调用
makeCallback
的上下文的一部分,所以在创建函数和以后调用函数之间不会发生变化

可以将数据绑定到函数的另一种方法是使用(在后台有效地创建闭包),这是NodeJS中可用的ES5功能,因为V8引擎有它。下面是它的外观:

for(j in groups){
  doSomething(function(jarg) {
    // Callback for `doSomething`
    console.log(jarg, somefunction(groups[jarg]));
  }.bind(this, j)); // <== Note the bind
}
有关闭包的更多信息:

    • 这样做:-

      for(var j in groups) { //Your code } 对于(组中的var j) { //你的代码 }
      j没有返回正确的值,因为您在全局范围内指定了j。希望这有帮助

      两件事:1。您引用的代码并没有做到这一点(您在简化问题的过程中丢失了一些东西——很容易做到!),以及2。JavaScript没有任何形式的按引用传递。所有参数都按值传递。对象(包括函数)是通过引用引用引用的,这与“通过引用传递”无关在他没有引用的代码上面,也没有(如果没有)j被用于其他任何东西(例如,它可能是一个隐式全局变量,而实际上不是问题)。要将
      j
      设置为所引用的内容,需要非常特定的一段看不见的代码。奥卡姆斯的剃须刀上写着…没那么多。 for(var j in groups) { //Your code }