1. 程式人生 > >從新來學一下 JS -- 第一章

從新來學一下 JS -- 第一章

先從經典的  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   引用的就是一個區域性物件了。而這個區域性物件會在函式執行完畢後立即被銷燬。

 

所以  我們看到的  最終值  是  “物件” 不是  “新物件”;

 

哈哈哈哈   是不是 很好玩兒  ;有意思 呀;