js 函數傳遞參數類型問題(基本類型和引用類型)

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作爲一個局部變量會在函數執行完畢後立即被銷燬。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章