2017-05-12 30 views
0
內引用改變

有人可以解釋爲什麼在一個函數(nextInLine)裏的數組引用(改編)操作更改全局數組中的值(我知道)在我的函數內在全球陣列globalArr上運行?全局聲明數組的時候沒有特別的功能

我認爲在傳遞給函數的值的函數中操作基本上就像在局部變量上操作一樣,我必須從函數內引用全局變量或返回值,如果我想讓這些值可訪問功能之外。

https://codepen.io/jakeNesom/pen/eWMXdP?editors=1111

function nextInLine(arr, item) { 


    arr.push(item); 
    item = arr.shift(); 
    return item ; 
} 

// Test Setup 
var globalArr = [1,2,3,4,5]; 

// Display 
console.log("Before: " + JSON.stringify(globalArr)); 
console.log(nextInLine(globalArr, 10)); // Modify this line to test 
console.log("After: " + JSON.stringify(globalArr)); 
+0

的[可能的複製是JavaScript的一個通逐引用或傳遞值語言?](http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language) – rmalviya

回答

0

JavaScript是按值傳遞,所以當你調用你的函數類似這樣的

nextInLine(globalArr, 10) 

傳遞到該函數指向您已經initilised您的陣列相同的位置globalArr參考。

因此,當你nextInLine函數中調用

arr.push(item); 

你推一個項目到您的全局數組。

我想你弄錯了什麼內部的溫控功能只在一個函數的範圍是聲明的變量,除非你回到那裏去參考如

function foo(){ 
    var a = 10; 
    console.log(a); //10 
} 
console.log(a); //undefined 
+0

謝謝你的徹底的解釋 - 我沒有意識到傳遞給函數的對象是引用 – Jake

0

這是因爲你傳遞一個對象(globalArr)的功能。當你傳遞一個對象時,你傳遞它的引用。但是,JavaScript中的默認機制是通過值傳遞的。這就是爲什麼當你修改它的函數時,你的數組的排序值也會改變。