2015-07-21 72 views
0

我試圖將全局定義數組作爲參數傳遞給函數。 我想這個函數會把參數當作局部變量。 但它不...更改(在我看來)局部變量也改變全局數組的值。我究竟做錯了什麼?將全局數組傳遞給函數覆蓋數組

clickX = []; 
for(var i=0; i<10; i++) { 
    clickX[i] = i; 
} 
doThis(clickX); 

function doThis(x) { 
    for(var i=0; i<x.length; i++) { 
     x[i]++; 
     alert(clickX[i]); // this alerts the changed value of x[i] and not the origin value of the global array 
    } 
} 

的jsfiddle: https://jsfiddle.net/n546rq89/

+2

對象在JS中通過引用傳遞。 ('var x = [1,2,3]; var y = x; y.splice(0,1); console.log(y); // [2,3]') – tymeJV

+0

你沒有改變變量(這確實是本地的,你可以通過'x = []'確認),你正在改變對象(通過修改它的屬性)。 – Bergi

+0

謝謝,不是它變得更清晰。如何在不更改原始對象的情況下更改函數中對象的值?以某種方式重複它? – Henning

回答

0

在Javascript中,陣列由默認引用傳遞。您也可以通過ARRAY.slice()按值傳遞:

clickX = []; 
for(var i=0; i<10; i++) { 
    clickX[i] = i; 
} 
doThis(clickX.slice()); 

function doThis(x) { 
    for(var i=0; i<x.length; i++) { 
     x[i]++; 
     alert(clickX[i]); // this alerts the changed value of x[i] and not the origin value of the global array 
    } 
} 

this thread在JS的的slice()解釋和複製陣列。