各位资深开发人员大家好,

我正在编写节点应用程序,遇到了计数器问题,但这可能是纯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传递。

我的问题是,counterarrcounter都在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);

}();

07-28 10:17