2013-07-15 36 views
1

不知道這是否是正確的方式來提出我的問題。如果我設置了以下的一段JavaScript代碼:JavaScript函數參數存儲引用

var x = 5; 
var y = function(z) { 
    z=7; 
    return z; 
} 
y(x); 
x; 

我得到7從函數調用返回,但x保持其原始值。我認爲JavaScript變量是通過引用調用的,所以x的值如何通過函數實際上沒有改變?

+2

基元通過價值傳遞。 –

+1

http://stackoverflow.com/questions/6605640/javascript-by-reference-vs-by-value –

回答

3

這裏真正的問題是,你沒有任何變異;您只需在函數中重新分配變量z即可。如果你傳遞了一個對象或者數組,它就沒有什麼區別。

var x = ['test']; 
var y = function(z) { 
    z=['foo']; 
    return z; 
} 
y(x); 
x; // Still ['test'] 

現在,說什麼別人也是如此。 基元不能突變。這實際上是更有趣的比它的聲音,因爲下面的代碼工作:

> var x = 1; 
> x.foo = 'bar'; 
"bar" 
> x 
1 
> x.foo 
undefined 

通知分配給x.foo怎麼看似成功,但x.foo是無處可尋。這是因爲JavaScript很容易強制原始類型和對象類型(有基本對象的「對象」版本,即普通對象)。在這種情況下,基元1被強制爲一個新對象(new Number(1)),其屬性foo已被設置,然後立即銷燬,因此不會產生持久效果。

+0

噢好吧。所以當我在函數中重新賦值'z'時,'z'和'x'不會指向相同的數組/對象?我認爲這就是通過引用調用的意思。你能幫我理解我沒有得到什麼嗎?再次感謝您的答案! – user2066880

+2

@ user2066880 - 它們是相同的對象,直到您在函數內重新賦值'z'爲止。到此爲止,您可以使用'z'來修改對象,並且可以在調用代碼中看到這些修改。如果你在這段代碼中用'z [0] ='foo';'替換了'z = ['foo'];',那麼調用代碼中的'x'將被改爲'['foo']'。 –

2

由於@TeddHopp這個注:

只有值傳遞的所有變量,而不是原語。您 不能通過將調用代碼傳遞給 函數來更改調用代碼中的變量。 (當然,你可以改變可能 傳遞的對象或數組;然而,變量本身仍然在呼籲 代碼不變。)

如果你想的x價值反正改變,你可以這樣做:

x = y(x); 
+0

只爲所有變量傳遞值,而不僅僅是基元。您不能通過將函數傳遞給函數來更改調用代碼中的變量。 (當然,您可以更改可能傳遞的對象或數組;但是,調用代碼中的變量本身保持不變。) –

+0

謝謝。你每天學習新的東西。猜我更習慣Java :) –