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