2012-10-24 45 views
0

JavaScript中的對象是否通過引用傳遞? 如果是爲什麼此代碼無法正常工作。通過引用或按值傳遞

function change(myObj) 
{ 
myObj={}; 
myObj.a=2; 
} 
o={a:1}; 
change(o); 
alert(o.a); //alert 1 

但是當我做

function change(myObj) 
{ 

myObj.a=2; 
} 
o={a:1}; 
change(o); 
alert(o.a); //alert 2 
+1

http://stackoverflow.com/questions/9437981/object-pass-by-reference –

回答

3

我會解釋這徹底

o={a:1};
首先你設置全局變量o是具有屬性變量與值= 1名這個對象{A:1}新的匿名對象的引用爲「1A 「

change(o);
現在給你打電話的功能變化和typeof運算變量o的JavaScript的檢查,它的‘對象’
實際上它應該是‘引用,指向的對象’,所以對象的引用{A:1}是傳遞到功能順便說一句,如果變量是原始的,它將只通過值

function change(myObj){
現在函數更改默認情況下創建變量myObj,其類型爲'undefined',然後因爲它獲取了引用參數而變爲'object',並且現在變量myObj是指向對象'1A'的引用變量=> {a: 1},myObj僅在函數變化 中可見,如果myObj只是對象'1A'的引用副本=> {a:1},則全局變量o仍可指向對象'1A'=> {a:1}通過語言設計

myObj={};
現在參考變量MyObj中被點到新的匿名空對象{}名此對象爲「2B」

myObj.a=2; }
現在您使用引用myObj將對象'2B'=> {}設置爲具有值爲2的新屬性a並且結束意味着全局無法看到對象'2B'=> {a: 2}

alert(o.a); //alert 1
變量仍然指向或者可以被重新指向對象{A:1},參考ö不能失去其點,因爲
對象 '2B'=> {A:2}不能在函數更改
之外被看到,並且將被垃圾回收銷燬,因爲它丟失了引用
而對象'1A'=> {a:1}不能被垃圾回收銷燬
,因爲變量o仍然指出爲什麼你打電話給你收到物品'1A'=> {a:1}


對不起,我的語法錯誤,但我盡我所能,使其易於閱讀。

+0

哇這個很好解釋謝謝 – user1758424

2

在這種情況下要覆蓋參考實際的對象。

function change(myObj) 
{ 
myObj={}; //overwriting the reference in myObj here. 
myObj.a=2; 
} 
o={a:1}; 
change(o); 
alert(o.a); //alert 1 

認爲它是這樣的:

function change(myObj = referenceToObjectPassedIn) 
myObj = new Object() ; 
    // referenceToObjectPassedIn lost in limbo 
myObject.a = 2; //modifying newly created object. 

解決你的問題,你將不得不返回新對象。

+0

謝謝,這是非常有益的 – user1758424

3

對該對象的引用傳遞給方法。在第一個示例中,您正在修改引用以指向其他對象,而不是嘗試更改引用指向的對象,因此,該更改在該方法之外不可見。

在第二個示例中,您正在更改由myobj引用指向的對象的狀態,因此在方法外可見。

+0

所以它像c語言中的指針? – user1758424

+0

不,像java中的引用。在C中,如果你傳遞一個指向方法的指針,改變指針指向一個不同的內存位置,這個改變在被調用的方法中是可見的。 – Vikdor

+0

哦對吧謝謝我瞭解 – user1758424

0

在示例1中,您更改了myObj引用的內容,因此最終會更改不同的對象,然後是您想要的對象。當

alert(o.a); 

被執行,o.a自從對象聲明以來沒有被改變,所以返回1。我希望這會有所幫助。還請閱讀本文,它應該清除一些東西,當我第一次學習JavaScript時幫助了我:http://www.snook.ca/archives/javascript/javascript_pass/