[英]Normal Counter vs Array Counter via function
各位資深開發人員大家好,
我正在編寫節點應用程序,遇到了計數器問題,但這可能是純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
沒有呢? 在這種情況下, counter
的正確處理方法是什么?
在Javascript中,原始類型按值傳遞。 在您的情況下,計數器也會通過值傳遞,並且對它所做的更改將不會被反映回來。 您將i
推入arrCounter array
,該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); }();
var func2 = function(i,counter,arrcounter)
{
counter++;
console.log('counter is ' + counter);
arrcounter.push(i);
console.log('arrcounter ' + arrcounter);
}
此處計數器參數首先已傳遞0。 在javascript中,原始類型變量是通過value傳遞的,而不是通過引用傳遞的。 在這里,變量計數器是數字類型,並且是原始類型。 因此,當將其傳遞給func2時,將為func2創建一個局部變量計數器。 因此,它將增加func2函數的本地計數器參數,而不是您在looptest函數中聲明的計數器變量
func2的本地計數器參數將增加為1,但是您在looptest函數中聲明的變量計數器將保持不變,因此,每次您要用0喂它時。
您可以嘗試以下方法:
var looptest = function(){
var counter = 0;
var arrcounter = [];
for (var i = 0 ; i<10 ; i++)
{
counter++;
func2(i,counter,arrcounter);
}
}();
在javascript變量中指向對象。 這就是分配的作用-它們指向左手以引用右手。
當您將變量counter
傳遞給func2
,參數指向對象,在這種情況下為數字。 當func2
然后將變量counter
重新分配給新對象時,它將使用局部counter
變量並將其指向其他數字對象。 這對looptest
的變量counter
沒有影響。 因此,for循環的每次迭代都會將0
傳遞給func2
。
當您傳遞數組時,它將傳遞對該數組的引用,因此func2
中的數組與loopiest'. In 'func2' you don't reassign the variable
的數組是同一對象loopiest'. In 'func2' you don't reassign the variable
loopiest'. In 'func2' you don't reassign the variable
arr , but rather alter the original object, so the changes are seen in the
循環測試, but rather alter the original object, so the changes are seen in the
. So you see the changes reflected in
. So you see the changes reflected in
循環測試中. So you see the changes reflected in
`
在此示例中,您可以清楚地看到這一點:
function test(number, arr) { // reassign number number = 10; // change arr arr.push(1) /* try reassigning arr instead for a comparison */ // arr = [1] } function start(){ var number = 1 var arr = [] test(number, arr) // only arr has been changed console.log(number) console.log(arr) } start()
為了更好地了解哪些參數按值傳遞,哪些參數按引用傳遞。
function
的參數...原始類型 按值傳遞。
對象 (和數組)通過引用傳遞。
var butImGlobal = 1; var integerVar = 1; var stringVar = 'change or not ?'; var array = [0,1]; var obj = {fruit: 'apple'}; function test(byvalInt, byvalTest, byrefArr, byrefObj){ byvalInt = 99999; byvalTest = 'not change'; byrefArr.push('I\\'m new!'); byrefObj.fruit = 'pineapple'; butImGlobal = 'my value is changed, and I can change my type too!'; } document.getElementById('test').innerHTML = '<b>BEFORE</b><br/>integerVar = ' + integerVar + '<br/>stringVar = ' + stringVar + '<br/>array = ' + array.join(', ') + '<br/>obj.fruit = ' + obj.fruit + '</br>butImGlobal = ' + butImGlobal; test(integerVar, stringVar, array, obj); document.getElementById('test').innerHTML = document.getElementById('test').innerHTML +'<br/><br/><b>AFTER</b><br/>integerVar = ' + integerVar + '<br/>stringVar = ' + stringVar + '<br/>array = ' + array.join(', ') + '<br/>obj.fruit = ' + obj.fruit + '</br>butImGlobal = ' + butImGlobal;
<div id="test"></div>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.