#函數內沒有使用var定義的物件應該是個全域物件呀
在紅寶書P71頁說是函數內部重寫obj時,這個物件引用變成了一個局部對象,不解~~
PHP中文网2017-06-14 10:55:31
特地抽出了我的紅寶書,這節,說的是參數按值傳遞;然後,對象按值傳遞,傳遞的是該對象所在地的指針。所以,第一步,有一個‘name’屬性為'chen'就好理解了。
因為obj,是函數的參數,實際意義相當在函數內,var
了一個obj
,後期,函數執行完,就會被銷毀。可能你看了後面的執行環境和作用域好理解一點。然後,obj = new Object()
時,obj的值,不是原person物件的指標了。
當然,你把第二行程式碼,換成'obj1',就有你說的全局聲明的效果了。 (很認真的答案)
淡淡烟草味2017-06-14 10:55:31
看了下網友給的參考答案,又自己琢磨了會,大概理解了,不知道對不對,八九不離十了吧!
ECMAScript中所有函數的參數是按值傳遞的
所以將person物件以實參形式傳遞給setName()時是將person物件的指標複製給了setName()
假設指向person物件的原始指標為一號,複製之後的指標為二號
這兩個指標同時指向person物件
所以在函數內執行obj.name="chen";時會根據二號指針順藤摸瓜的給person物件增加一個name屬性
但在執行obj=new Object();時,會將二號指針指向一個新對象,而不是原來的person對象
所以在執行obj.name="long";時,並不會更改person對象的name屬性
console .log(person.name);會返回"chen"
而obj即形參,並不是實參,不存在全局局部之分,在函數執行完畢之後即被銷毀,也就是不再存在二號指針,也就不存在指向"long"這個name屬性的指標了。