- 摘自JS高級程序-第三版
JS中所有的函數的參數都是按值傳遞的!!!
雖然訪問變量有按值和按引用傳遞兩種,但是函數參數的傳遞只能按值傳遞。具體的方法是:
如果是基本類型的值,就將值復制給函數參數,其實也就是arguments對象中的一個元素。
如果是引用類型的值,就將這個值在內存中的地址復制給函數參數。
在函數內部,函數參數實際上是一個局部變量。
如果函數參數保持傳入的引用地址不變,則在函數內部改變函數參數所指向的對象的值,在函數外訪問時該對象也會隨之改變。如果函數參數中途被改變過,則會指向新的對象,丟失原來的地址引用,此時改變函數參數所指對象的值,不會對函數外的對象造成改變。
代碼對比如下:
function setName(obj) {
obj.name = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"function setName(obj) { obj.name = "Nicholas"; obj = new Object(); obj.name = "Greg"; } var person = new Object(); setName(person); alert(person.name); //"Greg"
解析:上述中,在函數內部修改了形參的值,形參指向了一個新創建的對象,但原始的引用仍未改變。obj與person所引用的已經不再是同一個對象,所以兩者的修改互不影響。而且obj指向的對象是一個局部對象,會在函數執行完畢后立即被銷毀。