搜尋

首頁  >  問答  >  主體

javascript - js函數內沒有使用var定義的物件是局部物件嗎?

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

typechotypecho2721 天前919

全部回覆(4)我來回復

  • PHP中文网

    PHP中文网2017-06-14 10:55:31

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

    回覆
    0
  • 欧阳克

    欧阳克2017-06-14 10:55:31

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

    回覆
    0
  • 女神的闺蜜爱上我

    女神的闺蜜爱上我2017-06-14 10:55:31

    obj 是參數

    回覆
    0
  • 淡淡烟草味

    淡淡烟草味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屬性的指標了。

    回覆
    0
  • 取消回覆