2014-03-31 32 views
0

我遇到了多次打電話的問題。每次我調用它時,它都會收到新的數據(即使它與前面的數據相同),但以某種方式,下一次調用該函數將導致第一次調用該函數時的輸出結果。jquery函數 - 當第二次調用,不接收新的數據,使用舊的?

代碼:

$.calc=function(arrayName){ 
    console.log(arrayName); 
    for(i=0;i<arrayName.length;i++){ 
     if(i==2){ 
      arrayName[i]=""; 
     } 
    } 
} 

var arr=new Array(); 
arr[0]="saab"; 
arr[1]="saab"; 
arr[2]="saab"; 
arr[3]="saab"; 
arr[4]="volvo"; 
arr[5]="volvo"; 

//First run 
$.calc(arr); 

//Second run 
$.calc(arr); 

如果您運行的代碼(http://jsfiddle.net/76bme/)並打開控制檯記錄器/ devtools你可以看到我打印出來,我與函數傳遞沿陣列的內容,在做數組之前。 我下次調用該函數時,我將同一個數組(arr)傳遞給函數中的第一次調用,所以我期望console.log在開頭打印出數組中相同的內容。但是現在數組保存了一切,除了在索引2處我修改爲「」之後我用console.log打印出來之後。如果這是另一種方式,我會得到它(在for循環後有console.log),但現在我只是困惑!?

那麼我做錯了什麼?

+2

我在控制檯跑這和它的工作就好了。 – Seiyria

+0

[「saab」,「saab」,「saab」,「saab」,「volvo」,「volvo」] [「saab」,「saab」,「」,「saab」,「volvo」 「volvo」]' – j08691

+1

[Chrome的JavaScript控制檯是否懶惰地評估數組?](http://stackoverflow.com/questions/4057440/is-chromes-javascript-console-lazy-about-evaluating-arrays) – epascarello

回答

0

這是因爲arrayName是對您的數組對象的引用。所以當你改變那個物體的東西時,你的arr也會受到影響。如果你不希望這種行爲,你需要「創建副本」的數組:

$.calc=function(arrayName){ 
    console.log(arrayName) 
    var myArr = Array.prototype.slice.call(arrayName); //Just here! 
    for(i=0;i<myArr.length;i++){ 
     if(i==2){ 
      myArr[i]=""; 
     } 
    } 
} 

小提琴:http://jsfiddle.net/76bme/5/

+0

謝謝!我實際上並不知道JS的那麼多,所以我從未想過我正在改變對原始數組的引用。 :) – Niclas

0

變化

console.log(arrayName); 

console.log(arrayName.join(";")); 

你會看到你所期望的。控制檯[取決於狀態]在當前記錄時不顯示對象/數組的快照,有時它會存儲對它的引用,因此它將具有當前值。

相關問題