各位资深开发人员大家好,
我正在编写节点应用程序,遇到了计数器问题,但这可能是纯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 loop
之前声明,为什么
arrcounter
不能正确地保持“跟踪”呢?在这种情况下,对counter
采取的正确方法是什么? 最佳答案
在Javascript中,原始类型按值传递。在您的情况下,计数器也会按值传递,并且对它所做的更改将不会反映出来。在i
中按arrCounter array
会增加,这就是为什么arrCounter数组显示正确数据的原因。您的counter
变量不是global
变量,而是按值传递给func2(),因此在func2()
中对其所做的更改将不会被反映回来,这就是为什么始终仅将其传递为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);
}();