ECMAscript函數的按值通報照樣按援用通報

ECMAscript中所有的函數的參數都是按值通報的

把函數外部的值複製給函數內部的參數,就和把值從一個變量複製到另一個變量一樣。然則又很多人疑心,由於接見變量有按值和按援用兩種體式格局,而參數只能按值通報。

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,從而迴響反應函數內部的修正。

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時,這個變量援用的就是一個部分對象了。而這個部分對象會在函數實行完后馬上燒毀。

    原文作者:liaojin1
    原文地址: https://segmentfault.com/a/1190000015305970
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞