js函式的傳參是按值傳對遞

2022-09-11 18:39:07 字數 1451 閱讀 6930

根據js高階程式設計第三版編寫,對於函式的引數只能按值傳遞是這樣解釋的:

ecmascript 中所有函式的引數都是按值傳遞的。也就是說,把函式外部的值複製給函式內部的引數,就和把值從乙個變數複製到另乙個變數一樣。

基本型別值的傳遞如同基本型別變數的複製一樣,

而引用型別值的傳遞則如同引用型別變數的複製一樣。

有不少開發人員在這一點上可能會感到困惑,因 為訪問變數有按值和按引用兩種方式,而引數只能按值傳遞?????????

1:在向引數傳遞基本型別的值時,被傳遞的值會被複製給乙個區域性變數(即命名引數,或者用 ecmascript的概念來說,就是 arguments 物件中的乙個元素)。

function addten(num)

num += 10;

return num;

} var count = 20;

var result = addten(count);

alert(count);   //20,沒有變化

alert(result);  //30

2:在向引數傳遞引用型別的值時,會把 這個值在記憶體中的位址複製給乙個區域性變數,因此這個區域性變數的變化會反映在函式的外部。

function setname(obj)

obj.name = "nicholas";

} var person = new object();

setname(person);

alert(person.name);      //"nicholas"

有很多開發人員錯誤地認為:在區域性作用域中修改的物件會在全域性作用域中反映出來,就說明 引數是按引用傳遞的。

為了證明物件是按值傳遞的,我們再看一看下面這個經過修改的例子: 

function setname(obj)

obj.name = "nicholas";

obj = new object();

obj.name = "greg";

} var person = new object();

setname(person);

alert(person.name);        //"nicholas"

如果 person 是按引用傳遞的,那麼 person 就會自動被修改為指向其 name 屬性值 為"greg"的新物件。這說明即使在函式內部修改了引數的值,但原始的引用仍然保持未變。

至此書上對函式值傳遞講解完畢,但是。。。。

(對書上這句話不是很理解,為什麼按引用傳遞,結果應該是greg???就算是按引用傳遞,傳遞的也是指向記憶體的位址,當對函式區域性變數obj重新賦值新物件時,obj的存值也是新物件的記憶體位址,當然不能改變原記憶體位址所對應的物件值,當函式執行完畢,改新物件即函式內部的區域性物件會被立即銷毀。所以該點不能用來證明函式在傳遞物件引數的時候不是使用引用傳遞。)

其實用法和結果可能大家都理解且明白,本人也只是對這個概念抱有懷疑態度。有錯誤的地方,還請糾正。

js函式的傳參是按值傳對遞

科技優家 2016 11 22 16 01 根據js高階程式設計第三版編寫,對於函式的引數只能按值傳遞是這樣解釋的 ecmascript 中所有函式的引數都是按值傳遞的。也就是說,把函式外部的值複製給函式內部的引數,就和把值從乙個變數複製到另乙個變數一樣。基本型別值的傳遞如同基本型別變數的複製一樣,...

js函式傳參是按值傳遞還是按引用傳遞?

基本型別 引用型別 閒扯完了,開始寫今天要總結的基礎知識。基本型別 undefined null boolean number string五種 簡單的資料段 引用型別 object 由多個值構成 兩種型別在使用上的區別 複製變數 這塊好理解,看乙個例子的對比就秒懂 基本型別 var num1 5 ...

python函式傳參是傳值還是傳引用?

首先還是應該科普下函式引數傳遞機制 傳值和傳引用是什麼意思?函式引數傳遞機制問題在本質上是呼叫函式 過程 和被呼叫函式 過程 在呼叫發生時進行通訊的方法問題。基本的引數傳遞機制有兩種 值傳遞和引用傳遞。值傳遞 passl by value 過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在...