各位优秀的开发人员大家好,
我正在编写一个 Node 应用程序,遇到了一个计数器问题,但这可能是一个纯JS问题。
我编写了这个测试代码(而不是我的复杂问题),以便更清楚地呈现问题。
var func2 = function(i,counter,arrcounter)
{
counter++;
console.log('counter is ' + counter);
arrcounter.push(i);
console.log('arrcounter ' + arrcounter);
}
var looptest = function(){
var counter = 0;
var arrcounter = [];
for (var i = 0 ; i<10 ; i++)
func2(i,counter,arrcounter);
}();
如您所见,我在 for 循环之前声明了 var counter = 0
,以及一个名为 arrcounter
的数组,并将其传递给 func2
,func2
在每次迭代时都会被调用。
我得到了这个输出:
counter is 1
arrcounter 0
counter is 1
arrcounter 0,1
counter is 1
arrcounter 0,1,2
counter is 1
arrcounter 0,1,2,3
counter is 1
arrcounter 0,1,2,3,4
counter is 1
arrcounter 0,1,2,3,4,5
counter is 1
arrcounter 0,1,2,3,4,5,6
counter is 1
arrcounter 0,1,2,3,4,5,6,7
counter is 1
arrcounter 0,1,2,3,4,5,6,7,8
counter is 1
arrcounter 0,1,2,3,4,5,6,7,8,9
正如您在上面所看到的,arrcounter
已“增量”纠正(我知道这并不完全是 array.push 的正确术语),但整数 counter
似乎在每次 func2 调用时都作为 0 传递。
我的问题是,counter
和arrcounter
都是在for循环
之前声明的,
那么为什么arrcounter
能够正确“跟踪”,而counter
却不能?在这种情况下,计数器的正确做法是什么?
最佳答案
在 Javascript 中,基本类型是按值传递的。在您的情况下,计数器也是按值传递的,对其所做的更改不会反射(reflect)回来。您将 i
插入 arrCounter 数组
中,该数组正在不断增加,这就是 arrCounter 数组显示正确数据的原因。您的 counter
变量不是 global
变量,而是按值传递给 func2() ,因此在 func2()
中对其所做的更改不会反射(reflect)回来,这就是为什么它始终仅作为 0 传递的原因。
如果您要增加计数器变量并将其值发送到 Func2()
,它将开始显示正确的结果,请尝试以下操作:
var func2 = function(i,counter,arrcounter)
{
console.log('counter is ' + counter);
arrcounter.push(i);
console.log('arrcounter ' + arrcounter);
}
var looptest = function(){
var arrcounter = [];
var counter = 0;
for (var i = 0 ; i<10 ; i++)
func2(i,counter++,arrcounter);
}();
关于javascript - 普通计数器与通过函数的数组计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51012893/