下面這段代碼,一直很迷惑,求解答:
function setName(obj){
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name); // 輸出結果是 "Nicholas"
提問:
1、為什么輸出結果不是Greg?
2、如何理解函式內 的第一個obj 和 第二個obj 之間 的關系?
3、是否可以 理解 函式setName、形參obj、變數person 都屬于全域物件window下面的屬性? 他們都是父親window的兒子,是同輩關系。
obj.name = "Nicholas"; 就是 形參obj的兒子,所以是全域的 孫子?
obj = new Object(); 屬于函式的兒子,所以也是全域的孫子? obj.name = "Greg"; 就是孫子的兒子。
所以,第二個obj 是 第一個 obj的晚輩,他們不是同一個。只是名字相同,讓人誤解。可以這么理解嗎?
4、我一直搞不清楚形參,該如何正確理解形參? 這里的形參obj帶有屬性name,這個形參也是物件?
uj5u.com熱心網友回復:
你這關系論的,把我搞糊涂了,簡單點兒吧,第一個obj形參拿到傳進去的person物件的地址,然后對形參obj.name賦值,也就是person物件的name真的被改變了,然后obj重新賦值給了Object的地址,這個時候跟person沒關系了,再修改修改的就是new 出來的那個Object.name的值了,跟原來的person沒關系了。形參:如果傳進去的是值型別,形參就是實參的副本,如果傳進去的是參考型別,那么它拿到的就是實參的參考地址,對形參操作,也就是對實參參考的物件進行操作,所以實參也會改變。
uj5u.com熱心網友回復:
function setName(obj){//甲進屋了,坐在了obj位置上obj.name = "Nicholas";//甲改名叫Nicholas了
obj = new Object();//屋里新來了個乙并做在了obj位置上,因而甲離開了obj位置
obj.name = "Greg";//obj位置上的乙改名叫Greg了
//所以現在甲的名字叫Nicholas
}
var person = new Object();//創建了個甲
setName(person);//甲進入到了setName屋子里
alert(person.name); // 這里自然是Nicholas
uj5u.com熱心網友回復:
變數是一個參考關系,你可以說它是個標簽物件是標簽打在的東西上,比如你運快遞,我們都叫A包裹B包裹什么的,如果我把a包裹改名成B包裹,那我修改B包裹修改的就是原來A包裹的內容。最后運到你手上快遞員說這個是A包裹,打開一看里面東西變了,就是這個道理。東西一直都是這個東西,稱呼變了而已。
再看這個代碼:
var person = new Object();假設這個是A包裹
setName(person);//我把A包裹塞進倉庫里給快遞員處理。
快遞員處理程序:
obj//我們設快遞員手上的包裹叫obj
obj.name = "Nicholas"; //快遞員打開包裹發現里面有個名簽,寫上了名字Nicholas
obj = new Object();//快遞員手上的包裹被換成了另一個包裹
obj.name = "Greg";//快遞員打開包裹發現里面有個名簽,寫上了名字Greg
快遞員處理完了
我拿來我的包裹發現里面的名簽是什么呢?
uj5u.com熱心網友回復:
obj相當于函式內部的一個變數,和你傳進去的person是兩個東西,js中給變數賦值為參考型別時,變數存的都是地址。uj5u.com熱心網友回復:
感謝! 我明白了,原來我一直誤以為函式內的兩個 obj是不同的:一個是形參obj, 另外一個是變數obj。
原來函式的obj都是形參 obj,只是被指向了兩次。第二次obj指向了一個新物件。 是不是形參接受 實參的傳入,可以用代碼這么理解:
形參代碼 obj 都被 person代替? 如下所示:
function setName(person){
person.name = "Nicholas";
person = new Object();
person.name = "Greg";
}uj5u.com熱心網友回復:
感謝,描述的很生動! 但有一點一直不太理解:
var person = new Object();//創建了個甲
既然創建甲 在先,為什么不將這一句放在函式之前(畢竟創建在前)? 為什么都習慣放在函式(甲進屋)后面呢?
這個邏輯順序好像違反常規思維。因此可能是我一直對函式和物件 費解的原因所在。
求解惑~~
uj5u.com熱心網友回復:
你的意思是,函式內的 形參obj 只是個標簽, 但 包裹(物件)已經做了改變, 只是標簽obj一直沒變。可以這么理解嗎? 當person作為標簽傳入進去, obj這個標簽被換成了 person標簽, 那函式的內的 第二個包裹,也貼上了 person標簽?
uj5u.com熱心網友回復:
這個Object首先被貼上了person標簽,然后傳入到引數中又被貼上了obj標簽。設定完name后obj這個標簽被撕掉了貼到了另一個Object上了。在函式外Object是有person標簽的,所以用person參考name能看到的是Nicholas轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/67168.html
標籤:JavaScript
上一篇:基于詞袋模型識別xss攻擊
