- 摘自JS高級(jí)程序-第三版
JS中所有的函數(shù)的參數(shù)都是按值傳遞的!!著洼!
雖然訪問變量有按值和按引用傳遞兩種易茬,但是函數(shù)參數(shù)的傳遞只能按值傳遞。具體的方法是:
如果是基本類型的值萧吠,就將值復(fù)制給函數(shù)參數(shù)左冬,其實(shí)也就是arguments對(duì)象中的一個(gè)元素。
如果是引用類型的值纸型,就將這個(gè)值在內(nèi)存中的地址復(fù)制給函數(shù)參數(shù)拇砰。
在函數(shù)內(nèi)部九昧,函數(shù)參數(shù)實(shí)際上是一個(gè)局部變量。
如果函數(shù)參數(shù)保持傳入的引用地址不變毕匀,則在函數(shù)內(nèi)部改變函數(shù)參數(shù)所指向的對(duì)象的值铸鹰,在函數(shù)外訪問時(shí)該對(duì)象也會(huì)隨之改變。如果函數(shù)參數(shù)中途被改變過皂岔,則會(huì)指向新的對(duì)象蹋笼,丟失原來的地址引用,此時(shí)改變函數(shù)參數(shù)所指對(duì)象的值躁垛,不會(huì)對(duì)函數(shù)外的對(duì)象造成改變剖毯。
代碼對(duì)比如下:
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"
解析:上述中,在函數(shù)內(nèi)部修改了形參的值教馆,形參指向了一個(gè)新創(chuàng)建的對(duì)象逊谋,但原始的引用仍未改變。obj與person所引用的已經(jīng)不再是同一個(gè)對(duì)象土铺,所以兩者的修改互不影響胶滋。而且obj指向的對(duì)象是一個(gè)局部對(duì)象,會(huì)在函數(shù)執(zhí)行完畢后立即被銷毀悲敷。