從新來學一下 JS -- 第一章
阿新 • • 發佈:2018-11-22
先從經典的 new個新物件來吧;
function setName(obj) { obj.name = "物件"; //return obj.name = "新物件" obj = new Object(); obj.name = "新物件"; } var person = new Object(); setName(person); console.log(person); 先來解析一下 函式的執行; function setName(obj){} 我是命名了一個為 setName 的函式;它有一個 形參-變數(obj);沒有確定值 型別; 然後 obj.name = "物件" 這一賦值操作 ,將 我們宣告的 引數 obj 下的 叫做 name 的物件 賦值 “物件”;(語法上來說 這麼做是 不允許的 直接執行 會報錯 ;那麼如何解決 ? 向下看) 我們 打印出來 會發現 這個 obj 裡面 會有一個 叫做 name 的物件 ;他的值就是 string -- “物件”, 然後 我又 重新定義 obj ,(obj = new Object() ),然後重新賦值 其下的 name = “新物件”; 按照 執行順序 來說 現在 obj.name = “新物件”; 宣告 person 為一個 新物件( var person = new Object(); 在這裡 我們 規定了 person 為一個物件 ) 然後 呼叫了 函式 setName() 引數為 我宣告的 (person) 然後列印 console.log(person) 理論上 應該是 {name: "新物件"} 但是 事實上 列印結果 為 {name: "物件"}!!!!! 為什麼? 我明明 重新 new Object() 賦值 name = “新物件” 了呀!其實 在函式setName()內部修改了引數的值,但原始的引用仍然保持未變。實際上,當在函式setName()內部重寫obj 時,這
個變數 obj 引用的就是一個區域性物件了。而這個區域性物件會在函式執行完畢後立即被銷燬。
所以 我們看到的 最終值 是 “物件” 不是 “新物件”;
哈哈哈哈 是不是 很好玩兒 ;有意思 呀;