Javascript高階程式設計 備忘

青穗黃發表於2019-04-04

4.1.3 傳遞引數 ECMAScript中所有函式的引數都是按值傳遞的。也就是說,把函式外部的值複製給函式內部的引數,就和把值從一個變數複製到另一個變數一樣。基本型別值的傳遞如同基本型別變數的複製一樣,而引用型別值的傳遞,則如同引用型別變數的複製一樣。有不少開發人員在這一點上可能會感到困惑,因為訪問變數有按值和按引用兩種方式,而引數只能按值傳遞。

function setName(obj) {
    obj.name = "Nicholas";
}

var person = new Object();
setName(person);
alert(person.name);    //"Nicholas"
複製程式碼

以上程式碼中建立一個物件,並將其儲存在了變數person 中。然後,這個物件被傳遞到setName() 函式中之後就被複制給了obj 。在這個函式內部,obj 和person 引用的是同一個物件。換句話說,即使這個物件是按值傳遞的,obj 也會按引用來訪問同一個物件。於是,當在函式內部為obj 新增name 屬性後,函式外部的person 也將有所反映;因為person 指向的物件在堆記憶體中只有一個,而且是全域性物件。有很多開發人員錯誤地認為:在區域性作用域中修改的物件會在全域性作用域中反映出來,就說明引數是按引用傳遞的。為了證明物件是按值傳遞的,我們再看一看下面這個經過修改的例子:

function setName(obj) {
    obj.name = "Nicholas";
    obj = new Object();


    obj.name = "Greg";


}

var person = new Object();
setName(person);
alert(person.name);    //"Nicholas"
複製程式碼

相關文章