#函數(shù)內(nèi)沒(méi)有使用var定義的物件應(yīng)該是個(gè)全域物件呀
在紅寶書P71頁(yè)說(shuō)是函數(shù)內(nèi)部重寫obj時(shí),這個(gè)物件引用變成了一個(gè)局部對(duì)象,不解~~
Following the voice in heart.
特地抽出了我的紅寶書,這節(jié),說(shuō)的是參數(shù)按值傳遞;然後,對(duì)象按值傳遞,傳遞的是該對(duì)象所在地的指針。所以,第一步,有一個(gè)‘name’屬性為'chen'就好理解了。
因?yàn)閛bj,是函數(shù)的參數(shù),實(shí)際意義相當(dāng)在函數(shù)內(nèi),var
了一個(gè)obj
,後期,函數(shù)執(zhí)行完,就會(huì)被銷毀。可能你看了後面的執(zhí)行環(huán)境和作用域好理解一點(diǎn)。然後,obj = new Object()
時(shí),obj的值,不是原person物件的指標(biāo)了。
當(dāng)然,你把第二行程式碼,換成'obj1',就有你說(shuō)的全局聲明的效果了。 (很認(rèn)真的答案)
你這樣定義函數(shù)裡面寫的 只是一個(gè)形參 並不是實(shí)參 更談不上全局和局部。 。 。 。 。 。 。 。 。 。 。 。 。 。
看了下網(wǎng)友給的參考答案,又自己琢磨了會(huì),大概理解了,不知道對(duì)不對(duì),八九不離十了吧!
ECMAScript中所有函數(shù)的參數(shù)是按值傳遞的
所以將person物件以實(shí)參形式傳遞給setName()時(shí)是將person物件的指標(biāo)複製給了setName()
假設(shè)指向person物件的原始指標(biāo)為一號(hào),複製之後的指標(biāo)為二號(hào)
這兩個(gè)指標(biāo)同時(shí)指向person物件
所以在函數(shù)內(nèi)執(zhí)行obj.name="chen";時(shí)會(huì)根據(jù)二號(hào)指針順藤摸瓜的給person物件增加一個(gè)name屬性
但在執(zhí)行obj=new Object();時(shí),會(huì)將二號(hào)指針指向一個(gè)新對(duì)象,而不是原來(lái)的person對(duì)象
所以在執(zhí)行obj.name="long";時(shí),並不會(huì)更改person對(duì)象的name屬性
console .log(person.name);會(huì)返回"chen"
而obj即形參,並不是實(shí)參,不存在全局局部之分,在函數(shù)執(zhí)行完畢之後即被銷毀,也就是不再存在二號(hào)指針,也就不存在指向"long"這個(gè)name屬性的指標(biāo)了。