2013-03-14 21 views
3

有人可以在下面的代碼中解釋我,爲什麼當我做o = {}時,對象沒有被重置?Javascript:Pass By Reference

var funky = function (o) { 
    o.z = null; 
    o.a = "aaa";   
    o = {}; 
}; 

var x = { z: "zzz"}; 
funky(x); 

console.log(x); 
+0

嘗試設置O操作'null'代替。 – Paul 2013-03-14 15:09:39

+0

可能重複[在Javascript中通過引用傳遞變量](http://stackoverflow.com/questions/7744611/pass-variables-by-reference-in-javascript) – 2013-03-14 15:10:11

+0

將o設置爲null不會改變任何東西 – 2013-03-14 15:18:56

回答

7

因爲JavaScript不按引用傳遞。它通過值傳遞參考。

區別是微妙的,但重要的。它的要點是,對象變量的值不是一個對象;它是一個參考對象。傳遞變量傳遞該引用的副本。有了它,你可以隨意修改對象的內容,但是你無法用調用者可以看到的方式替換整個其他對象。

+0

Is there沒有辦法通過參考傳遞? – 2013-03-14 15:08:16

+3

您可以通過傳入對象並修改對象來「模擬」引用傳遞。但是,您不能重新分配對象。把它看作傳入一個可變對象的指針。您可以通過指針的成員修改對象,但不能重新指定指針,並期望外部函數採用修改後的指針。 – 2013-03-14 15:09:28

2

o只是它當前指向的別名,它不是實例(按值傳遞)。

如果你想效仿 「按引用傳遞」,你可以做到這一點:

var x = { ... }; 
var container = { x: x }; 
funky(container); 

現在你可以在funky()重置:

container.x = {}; 
+0

仍然我不知道我明白....你能解釋一下嗎?謝謝 – 2013-03-17 07:53:02

+0

你不能在你的函數中修改用'var x = ...'創建的對象。 'o = {};'不修改現有的對象,它會創建一個新的對象。 'o'現在指向新對象,但無法更改'x'。所以你需要把'x'放入另一個對象中。 – 2013-03-21 13:53:51