4.1.3 傳遞參數 ECMAScript中全部函數的參數都是按值傳遞的。也就是說,把函數外部的值複製給函數內部的參數,就和把值從一個變量複製到另外一個變量同樣。基本類型值的傳遞如同基本類型變量的複製同樣,而引用類型值的傳遞,則如同引用類型變量的複製同樣。有很多開發人員在這一點上可能會感到困惑,由於訪問變量有按值和按引用兩種方式,而參數只能按值傳遞。bash
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"
複製代碼