ECMAscript中全部的函數的參數都是按值傳遞的

ECMAscript中全部的函數的參數都是按值傳遞的函數


把函數外部的值複製給函數內部的參數,就和把值從一個變量複製到另外一個變量同樣。可是又不少人困惑,由於訪問變量有按值和按引用兩種方式,而參數只能按值傳遞。code

1.使用數值等基本類型值來講明按值傳遞對象

function addTen(num){
    num += 10;
    return num;
}
var count = 20;
var result = addTen(count);
console.log(count);//20,沒有變化
console.log(result);//30

這裏的addTen()有一個參數num,而參數其實是函數的局部變量。在調用這個函數時,變量count做爲參數被傳遞給函數,這個變量的值是20。所以數值20倍賦值給參數num以便在addTen中使用。在函數內部,參數num被加上了10,但這一變化並不會影響函數外部的count變量。*參數num與變量count互不認識,他們僅僅是具備相同的值。*若是num是按引用傳遞,那麼變量count將會變成30,從而反應函數內部的修改。ip

2.使用對象來講明按值傳遞參數內存

function setName(obj){
    obj.name = 'lihua';
}
var person = new Object();
setName(person);
console.log(person.name);//lihua

代碼將新建立的對象保存在person中,而後這個對象被傳遞到setName()函數以後就被複制給了obj。在這個函數內部obj和person引用的是同一個對象。即便這個對象是按值傳遞的,obj也會按引用來訪問同一個對象。所以在函數內部爲obj添加一個name屬性後,函數外不person也將有所反映;由於person指向得對象在堆內存中只有一個,並且是全局對象。所以許多人錯誤的認爲在局部做用域中修改的對象會在全局做用域中反映出來,就說明參數使按引用傳遞的,爲了證實對象是按值傳遞的,再看下一組代碼。作用域

function setName(obj){
    obj.name = 'lihua';
    obj = new Object();
    obj.name = 'xiaohua';
}
var person = new Object();
setName(person);
console.log(person.name);//lihua

與上一個例子的區別,就是在setName()中加了兩行代碼,一行爲obj從新定義了一個對象,另外一行代碼爲該對象定義了一個帶有不一樣的name屬性,再把person傳遞給函數setName後,name屬性被設置爲lihua。而後再將一個新對象賦值給變量obj,同時將其name屬性設置爲xiaohua。*若是person是按引用傳遞的,那麼person就會自動被修改成指向其name屬性值爲xiaohua的新對象,可是當接下來訪問person.name時,顯示的仍然是lihua,這說明即便在函數內部修改了參數的值,但原始的引用仍然保持未變。*實際上當函數內部重寫obj時,這個變量引用的就是一個局部對象了。而這個局部對象會在函數執行完後當即銷燬。io

相關文章
相關標籤/搜索