傳遞參數(shù)
ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的掖举。也就是說包券,把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù)濒旦,就和把值從一個(gè)變量復(fù)制到另一個(gè)變量一樣株旷。基本類型值的傳遞如同基本類型變量的復(fù)制一樣尔邓,而引用類型值的傳遞晾剖,則如同引用類型變量的復(fù)制一樣。有不少開發(fā)人員在這一點(diǎn)上可能會(huì)感到困惑梯嗽,因?yàn)樵L問變量有按值和按引用兩種方式齿尽,而參數(shù)只能按值傳遞。
在向參數(shù)傳遞基本類型的值時(shí)灯节,被傳遞的值會(huì)被復(fù)制給一個(gè)局部變量(即命名參數(shù)循头,或者用ECMAScript的概念來說绵估,就是arguments對象中的一個(gè)元素)。在向參數(shù)傳遞引用類型的值時(shí)卡骂,會(huì)把這個(gè)值在內(nèi)存中的地址復(fù)制給一個(gè)局部變量国裳,因此這個(gè)局部變量的變化會(huì)反映在函數(shù)的外部。請看下面這個(gè)例子:
function addTen(num) {
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
alert(count); ? ?//20偿警,沒有變化
alert(result); ?//30
這里的函數(shù)addTen()有一個(gè)參數(shù)num躏救,而參數(shù)實(shí)際上是函數(shù)的局部變量。在調(diào)用這個(gè)函數(shù)時(shí)螟蒸,變量count作為參數(shù)被傳遞給函數(shù),這個(gè)變量的值是20崩掘。于是七嫌,數(shù)值20被復(fù)制給參數(shù)num以便在addTen()中使用。在函數(shù)內(nèi)部苞慢,參數(shù)num的值被加上了10诵原,但這一變化不會(huì)影響函數(shù)外部的count變量。參數(shù)num與變量count互不相識挽放,它們僅僅是具有相同的值绍赛。假如num是按引用傳遞的話,那么變量count的值也將變成30辑畦,從而反映函數(shù)內(nèi)部的修改吗蚌。當(dāng)然,使用數(shù)值等基本類型值來說明按值傳遞參數(shù)比較簡單纯出,但如果使用對象蚯妇,那問題就不怎么好理解了。再舉一個(gè)例子:
function?setName(obj)?{
obj.name?=?"Nicholas";
}
var?person?=?new?Object();
setName(person);
alert(person.name);????//"Nicholas"
以上代碼中創(chuàng)建一個(gè)對象暂筝,并將其保存在了變量person中箩言。然后,這個(gè)變量被傳遞到setName()函數(shù)中之后就被復(fù)制給了obj焕襟。在這個(gè)函數(shù)內(nèi)部陨收,obj和person引用的是同一個(gè)對象。換句話說鸵赖,即使這個(gè)變量是按值傳遞的务漩,obj也會(huì)按引用來訪問同一個(gè)對象。于是卫漫,當(dāng)在函數(shù)內(nèi)部為obj添加name屬性后菲饼,函數(shù)外部的person也將有所反映;因?yàn)閜erson指向的對象在堆內(nèi)存中只有一個(gè)列赎,而且是全局對象宏悦。有很多開發(fā)人員錯(cuò)誤地認(rèn)為:在局部作用域中修改的對象會(huì)在全局作用域中反映出來镐确,就說明參數(shù)是按引用傳遞的。
本文由web前端精髓為您提供