傳遞參數(shù)
ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的。也就是說,把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù),就和把值從一個變量復(fù)制到另一個變量一樣?;绢愋椭档膫鬟f如同基本類型變量的復(fù)制一樣,而引用類型值的傳遞,則如同引用類型變量的復(fù)制一樣。有不少開發(fā)人員在這一點上可能會感到困惑,因為訪問變量有按值和按引用兩種方式,而參數(shù)只能按值傳遞。
在向參數(shù)傳遞基本類型的值時,被傳遞的值會被復(fù)制給一個局部變量(即命名參數(shù),或者用ECMAScript的概念來說,就是arguments對象中的一個元素)。在向參數(shù)傳遞引用類型的值時,會把這個值在內(nèi)存中的地址復(fù)制給一個局部變量,因此這個局部變量的變化會反映在函數(shù)的外部。請看下面這個例子:
function addTen(num) {
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
alert(count); ? ?//20,沒有變化
alert(result); ?//30
這里的函數(shù)addTen()有一個參數(shù)num,而參數(shù)實際上是函數(shù)的局部變量。在調(diào)用這個函數(shù)時,變量count作為參數(shù)被傳遞給函數(shù),這個變量的值是20。于是,數(shù)值20被復(fù)制給參數(shù)num以便在addTen()中使用。在函數(shù)內(nèi)部,參數(shù)num的值被加上了10,但這一變化不會影響函數(shù)外部的count變量。參數(shù)num與變量count互不相識,它們僅僅是具有相同的值。假如num是按引用傳遞的話,那么變量count的值也將變成30,從而反映函數(shù)內(nèi)部的修改。當(dāng)然,使用數(shù)值等基本類型值來說明按值傳遞參數(shù)比較簡單,但如果使用對象,那問題就不怎么好理解了。再舉一個例子:
function?setName(obj)?{
obj.name?=?"Nicholas";
}
var?person?=?new?Object();
setName(person);
alert(person.name);????//"Nicholas"
以上代碼中創(chuàng)建一個對象,并將其保存在了變量person中。然后,這個變量被傳遞到setName()函數(shù)中之后就被復(fù)制給了obj。在這個函數(shù)內(nèi)部,obj和person引用的是同一個對象。換句話說,即使這個變量是按值傳遞的,obj也會按引用來訪問同一個對象。于是,當(dāng)在函數(shù)內(nèi)部為obj添加name屬性后,函數(shù)外部的person也將有所反映;因為person指向的對象在堆內(nèi)存中只有一個,而且是全局對象。有很多開發(fā)人員錯誤地認(rèn)為:在局部作用域中修改的對象會在全局作用域中反映出來,就說明參數(shù)是按引用傳遞的。
本文由web前端精髓為您提供