回覆列表
  • 1 # ftnuf386

    如果person是按引用傳遞的,那麼person就會自動被修改為指向其name屬性值為"Greg"的新物件。但是,當接下來再訪問person.name時,顯示的值任然是"Nicholas"。這說明即使在函式內部修改了引數的值,但原始的引用任然保持不變。實際上,當在函式內部重寫obj時,這個變數引用的就是一個區域性物件了。而這個區域性物件會在函式執行完畢後立即被銷燬。從上面的例子中,尼古拉得出的結論是:當一個物件當做引數傳遞時,它是按值傳遞的。然而,我們可以肯定的是:當一個引用型別的物件不是當做引數傳遞時,它是按引用傳遞的。我們來看另外一個例子:varperson=newObject();varobj=person;obj.name="Nicholas";obj=newObject();obj.name="Greg";alert(person.name);//"Nicholas"這個例子中person物件不是當做引數傳遞的,但person.name的值還是"Nicholas",這和person當做引數傳遞的情況是一樣的。可以確定的是:這個例子中物件是按引用傳遞的。但按照尼古拉的說法這個例子中物件也是按值傳遞的。那麼可以得出結論:尼古拉的說法是錯的。我們可用圖來說明一下這個問題。當varperson=newObject()時,可以用下面這幅圖來描述變數和物件之間的關係:當varobj=person時,可以用下面這幅圖來描述它們之間的關係:當obj=newObject()時,用下面的圖描述它們的關係:我們可以把Object當成一箇中間人,它是聯絡person與obj的橋樑。之所以改變obj的屬性值,會影響person其實是透過Object來傳遞的。當obj=newObject(),這時obj與Object之間的關係完全斷開,與newObject建立了關係。當obj.name="Greg",此時,obj與"Object"之間已沒有關係,當然不會再影響"Object"。書中的例子是一樣的道理:functionsetName(obj){obj.name="Nicholas";obj=newObject();obj.name="Greg"; }varperson=newObject();setName(person);alert(person.name);//"Nicholas"obj相當於setName函式中的一個區域性變數,把person傳給函式就相當於varobj=person。其實我們完全可以把這個例子和上面介紹的那個例子看成是等價的,所以上面的圖解也適用這個例子。

  • 中秋節和大豐收的關聯?
  • 白襯衫上的油漆怎麼洗啊?