javascript - js函數內沒有使用var定義的物件是局部物件嗎?
typecho
typecho 2017-06-14 10:53:31
0
4
967

#函數內沒有使用var定義的物件應該是個全域物件呀
在紅寶書P71頁說是函數內部重寫obj時,這個物件引用變成了一個局部對象,不解~~

typecho
typecho

Following the voice in heart.

全部回覆(4)
洪涛

特地抽出了我的紅寶書,這節,說的是參數按值傳遞;然後,對象按值傳遞,傳遞的是該對象所在地的指針。所以,第一步,有一個‘name’屬性為'chen'就好理解了。
因為obj,是函數的參數,實際意義相當在函數內,var了一個obj,後期,函數執行完,就會被銷毀。可能你看了後面的執行環境和作用域好理解一點。然後,obj = new Object() 時,obj的值,不是原person物件的指標了。
當然,你把第二行程式碼,換成'obj1',就有你說的全局聲明的效果了。 (很認真的答案)

学霸

你這樣定義函數裡面寫的 只是一個形參 並不是實參 更談不上全局和局部。 。 。 。 。 。 。 。 。 。 。 。 。 。

女神的闺蜜爱上我

obj 是參數

淡淡烟草味

看了下網友給的參考答案,又自己琢磨了會,大概理解了,不知道對不對,八九不離十了吧!
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屬性的指標了。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板