在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ js高程中第71頁中的例子(關(guān)于傳遞參數(shù)的引用類型值的傳遞),兩個小問題理解不來

js高程中第71頁中的例子(關(guān)于傳遞參數(shù)的引用類型值的傳遞),兩個小問題理解不來

舉一個例子:
function setName(obj) {
obj.name = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
FunctionArgumentsExample02.htm
以上代碼中創(chuàng)建一個對象,并將其保存在了變量 person 中。然后,這個變量被傳遞到 setName()
函數(shù)中之后就被復制給了 obj 。在這個函數(shù)內(nèi)部, obj 和 person 引用的是同一個對象。**換句話說,即
使這個變量是按值傳遞的, obj 也會按引用來訪問同一個對象。---問題1:這里說的按值傳遞,這個值是指什么?**于是,當在函數(shù)內(nèi)部為 obj 添加 name
屬性后,函數(shù)外部的 person 也將有所反映;因為 person 指向的對象在堆內(nèi)存中只有一個,而且是全
局對象。有很多開發(fā)人員錯誤地認為:在局部作用域中修改的對象會在全局作用域中反映出來,就說明
參數(shù)是按引用傳遞的。為了證明對象是按值傳遞的,我們再看一看下面這個經(jīng)過修改的例子:
function setName(obj) {
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
這個例子與前一個例子的唯一區(qū)別,就是在 setName() 函數(shù)中添加了兩行代碼:一行代碼為 obj
重新定義了一個對象,另一行代碼為該對象定義了一個帶有不同值的 name 屬性。**在把 person 傳遞給
setName() 后,其 name 屬性被設置為 "Nicholas" 。---問題二:屬性被修改后能在函數(shù)外部讀取到,不就是引用類型嘛?后面的解釋理解不了**然后,又將一個新對象賦給變量 obj ,同時將其 name
屬性設置為 "Greg" 。如果 person 是按引用傳遞的,那么 person 就會自動被修改為指向其 name 屬性值
為 "Greg" 的新對象。但是,當接下來再訪問 person.name 時,顯示的值仍然是 "Nicholas" 。這說明
即使在函數(shù)內(nèi)部修改了參數(shù)的值,但原始的引用仍然保持未變。實際上,當在函數(shù)內(nèi)部重寫 obj 時,這
個變量引用的就是一個局部對象了。而這個局部對象會在函數(shù)執(zhí)行完畢后立即被銷毀。

回答
編輯回答
吢丕

1、按值傳遞的值:基本類型值存儲于棧內(nèi)存中,傳遞的就是當前值;引用類型值其實也存于棧內(nèi)存中,只是它的值是指向堆內(nèi)存當中實際值的一個地址。
2、function setName(obj) 接收的obj是引用類型的值(地址)的副本,通過此值obj找到堆中的實際值,然后再對實際值進行修改,所以實際值的屬性被修改后能在函數(shù)外部讀取到。

2018年2月25日 12:53
編輯回答
尛曖昧

傳入的 person 和 形參的 obj 是兩個指針,同時指向var person = new Object();new Object()創(chuàng)建的對象。
obj.name = "Nicholas";兩個指針指向同一對象, 即同時指向 {name: 'Nicholas'}。
obj = new Object(); obj指針指向了新的對象。
obj.name = "Greg"; 新的對象變成了{name: 'Greg'}
函數(shù)執(zhí)行結(jié)束,新對象的內(nèi)存被釋放。

2018年1月8日 21:12
編輯回答
礙你眼

怕我說不清,找了個鏈接深入理解參數(shù)按值傳遞
簡單的總結(jié):

參數(shù)如果是基本類型是按值傳遞,如果是引用類型按共享傳遞。

但是因為拷貝副本也是一種值的拷貝,所以在高程中也直接認為是按值傳遞了

2017年7月19日 16:38
編輯回答
挽歌

的確這里不太像是一般理解中的按值傳遞。

其實這里高程的例子已經(jīng)講的不錯了,引用類型傳入時候會創(chuàng)建一個新的同樣的對象并且賦值給形參。

類似于創(chuàng)建了一個新的地址,指針指向了實參地址,于是這個時候修改形參變量能夠同步修改到實參,但是如果重新賦值形參,則是修改了其指針指向,不再指向?qū)崊⒌刂贰?/p>

2017年11月8日 05:23