2013-05-30 41 views
2

從我所知道的,javascript,也是基於ECMAscript和actionscript一樣,並不是真正的通過引用傳遞對象。至少這是我最近閱讀的內容。例如:javascript/actionscript是否真的通過引用傳遞?

function doStuff(myObj){ 
    myObj.name = 'groovy chicken'; 
    myObj = null; 
} 
var newObj = new Object(); 
doStuff(newObj); 

這是一個例子,我在一本書「專業JavaScript進行Web開發人員」發現。儘管您將一個對象傳遞給該函數,並且添加name屬性實際上會將該屬性添加到您的初始對象,但當您設置爲null時,該對象將在本地作用域中銷燬,而不是在全局作用域中。

對我來說,這仍然有點令人困惑,因爲你的myObj仍然指向與newObj相同的位置,並且你可以動態地添加或改變屬性。唯一的區別是你不能在全球範圍內銷燬它。

所以我想知道如果相同也適用於動作,因爲從我讀過的,動作3實際上通過引用傳遞對象,我沒有讀任何說明相反的東西。

回答

2

極少數現代編程語言通過引用傳遞(至少默認情況下)。在「傳遞...」的扭曲術語中,您正在通過值傳遞參考。以下是如何考慮它:

  • myObjnewObj只是變量,名稱的東西。
  • 這些變量的值是當你調用doStuff(),你的名字myObj綁定到一個新的參考到對象(即引用本身是按值傳遞)
  • 的參考對象
  • 引用指向的內存,它的一些東西,這是什麼讓你改變名稱的doStuff()
  • 內您可以通過檢查任何一個變量看到的變化,因爲這兩個變量包含對同一對象的引用
  • myObj = null重新分配的一大塊變爲無,並在此過程中,它「銷燬」參考,但它不會破壞該物體。
  • 當垃圾收集器注意到沒有更多引用的對象時,它將銷燬該對象
0

我會盡力幫助你理解JavaScript的對象的工作:

當你說,

var newobj = new Object(); 

這裏,newobj只是一個名字,當你創建一個實例分配的內存位置對象。

當您傳遞newobj時,它會沿着對內存位置的引用。現在,函數中的myObj是同一個內存位置的另一個名稱。

添加方法「名稱」將其添加到內存位置,因此可用於newobj和myobj。

當您將myobj設置爲null時,它會刪除名稱引用,並且newobj仍然保持與name屬性集一致。

但是,我沒有關於如何在actionscript中工作的想法。