ECMAScript中所有函數的參數都是按值傳遞的。
因爲訪問變量有按值和按引用兩種方式,而參數只能按值傳遞,這可能會讓我們感到困惑。
在向參數傳遞基本類型的的值時,被傳遞的值會被複制給一個局部變量(即命名參數)。在向參數傳遞引用類型的值時,會把這個值在內存中的地址複製給一個局部變量,因此,這個局部變量的變化會反映在函數的外部。爲了證明對象是按值傳遞的,我們看下面的一個例子:
fuction setName(obj){
obj.name="Nicholas";
obj=new Object();
obj.name="gred";
}
var person=new Object();
setName(person);
alert(person.name); //Nicholas
在把person傳遞給setName()後,其name屬性被設置成爲“Nicholas”。然後又將一個新的對象賦給變量obj,同時將其name屬性設置爲“gred”。如果對象是按照引用傳遞的話,那麼person就會自動的被修改爲指向其name屬性爲“gred”的新對象。但是,當接下來再訪問person時,顯示的值仍然是“Nicholas”。這就說明了即使在函數內部修改了參數的值,但原始的引用仍然不變。實際上,當在函數內部重寫obj時,這個變量的引用就是一個局部對象了,而這個局部對象會在函數執行完畢時立即銷燬。
可以把ECMAScript函數的參數想象成爲局部變量。