1,傳遞基本類型參數,請看下面例子
function addNum(num) {
num + = 10;
return num;
}
var count = 20;
var result = addTen(count);
alert(count); //20, not change
alert(result); //30
在調用函數addTen(count), count作爲參數傳遞給函數的參數num,此時在內存中分配了一塊新的內存給num用於存儲值20(注意count 與 num處於內存中的不同位置,相互獨立),執行函數後 ,返回num的值,局部變量num被銷燬。
因此函數執行完成後,count的值不會改變,函數的返回值賦值給result,result的結果變爲30。
2,傳遞引用類型, 請看下面例子
function setName(obj) {
obj.name = "Evan Sung";
}
var persion = new Object();
setName(person);
alert(person.name); //"Evan Sung"
在調用函數setName(person), person作爲對象引用參數傳遞給obj,此時內存中定義了一個obj變量,對象指向person所指向的對象,因此obj.name="Evan Sung";執行後,person指向的對象中就有了一個name值爲"Evan Sung"的屬性。因此person.name輸出“Evan Sung”(注意這裏的person變量作爲參數傳遞的是按值傳遞(也就是說傳遞的是指針地址))下面來說明爲什麼是按值傳遞的,請看下面例子
function setName(obj) {
obj.name = "Evan Sung";
<strong>obj = new Object();
obj.name = "Nate";</strong>
}
var person = new Object();
setName(person);
alert(person.name); //"Evan Sung"
在setNae()函數中添加了兩行代碼,第一行代碼是重新定義一個obj對象,另一行代碼是爲該定義的新對象添加一個不同值得name屬性。
流程:person作爲變量傳遞給函數setName()後,此時obj與person都指向的是person對象的內存,name屬性被設爲“Evan Sung”,隨後又將其指向另外一個Object對象,在內存中相當於obj的指針發生改變,指向了另外一塊新建的object內存,在改變其name屬性時,由於此時obj的內存與person指向的內存不是同一塊內存,persont指向的內存中name屬性值不會發生改變。與此同時,在函數內部,obj作爲一個局部變量會在函數執行完畢後立即被銷燬。