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
}