不知道這是否是正確的方式來提出我的問題。如果我設置了以下的一段JavaScript代碼:JavaScript函數參數存儲引用
var x = 5;
var y = function(z) {
z=7;
return z;
}
y(x);
x;
我得到7
從函數調用返回,但x
保持其原始值。我認爲JavaScript變量是通過引用調用的,所以x
的值如何通過函數實際上沒有改變?
不知道這是否是正確的方式來提出我的問題。如果我設置了以下的一段JavaScript代碼:JavaScript函數參數存儲引用
var x = 5;
var y = function(z) {
z=7;
return z;
}
y(x);
x;
我得到7
從函數調用返回,但x
保持其原始值。我認爲JavaScript變量是通過引用調用的,所以x
的值如何通過函數實際上沒有改變?
這裏真正的問題是,你沒有任何變異;您只需在函數中重新分配變量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
已被設置,然後立即銷燬,因此不會產生持久效果。
噢好吧。所以當我在函數中重新賦值'z'時,'z'和'x'不會指向相同的數組/對象?我認爲這就是通過引用調用的意思。你能幫我理解我沒有得到什麼嗎?再次感謝您的答案! – user2066880
@ user2066880 - 它們是相同的對象,直到您在函數內重新賦值'z'爲止。到此爲止,您可以使用'z'來修改對象,並且可以在調用代碼中看到這些修改。如果你在這段代碼中用'z [0] ='foo';'替換了'z = ['foo'];',那麼調用代碼中的'x'將被改爲'['foo']'。 –
由於@TeddHopp這個注:
只有值傳遞的所有變量,而不是原語。您 不能通過將調用代碼傳遞給 函數來更改調用代碼中的變量。 (當然,你可以改變可能 傳遞的對象或數組;然而,變量本身仍然在呼籲 代碼不變。)
如果你想的x
價值反正改變,你可以這樣做:
x = y(x);
只爲所有變量傳遞值,而不僅僅是基元。您不能通過將函數傳遞給函數來更改調用代碼中的變量。 (當然,您可以更改可能傳遞的對象或數組;但是,調用代碼中的變量本身保持不變。) –
謝謝。你每天學習新的東西。猜我更習慣Java :) –
基元通過價值傳遞。 –
http://stackoverflow.com/questions/6605640/javascript-by-reference-vs-by-value –