首頁 >web前端 >js教程 >詳解JavaScript函數參數的傳遞方式

詳解JavaScript函數參數的傳遞方式

黄舟
黄舟原創
2017-03-22 14:54:221517瀏覽

本文主要介紹了JavaScript函數參數的傳遞方式,並且具有很好的參考價值。下面跟著小編一起來看下吧

JavaScript使用一個變數物件來追蹤變數的生存期。基本型別值直接保存在變數物件內;而引用型別值則是作為一個指標儲存在變數物件內,該指標指向實際物件在記憶體中的儲存位置。

基本型別值的傳遞

向參數傳遞基本型別值時,被傳遞的值會複製給一個局部變數(即命名參數,或是arguments物件中的一個元素)。

function addOne (num) {
 num++;
 return num;
}
var count = 1;
var result = addOne(count);
console.log(count); //1
console.log(result); //2

在上面的範例中,變數count的值會傳遞給函數的參數num以便在函數中使用,此時變數count和參數num的值雖然是一樣的,但是它們是兩個相互獨立的變量,在函數中改變參數num的值並不會影響函數外部的變量count的值。

因此JavaScript中函數的基本類型值參數的傳遞是按值傳遞的。

引用型別值的傳遞

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

在上面的範例中,變數person的值傳遞給函數的參數obj,此時在函數內部為參數obj增加一個name屬性,函數對參數obj的使得函數外部的變數person也獲得了一個name屬性。從結果上看,JavaScript中函數的參考類型值參數的傳遞似乎是按引用傳遞的。

然而並非如此。變數person的值是引用型別值,因此它的值在變數物件中可以看做是一個實際物件在記憶體中的位址(或指標)。傳遞參數以後參數obj的值是也是該物件在記憶體中的位址,因此在函數中操作參數obj的值所引用的物件相當於操作變數person的值所引用的物件。

function setName (obj) {
 obj.name = 'Nicholas';
 obj = new Object();
 obj.name = 'Greg';
 return obj;
}
var person = new Object();
var result = setName(person);
console.log(person.name); //'Nicholas'
console.log(result.name); //'Greg'

如果參數傳遞是按引用傳遞的,在上面的例子中,函數改變了參數obj的值所引用的對象,那麼相對應的變數person的值所引用的對像也會改變。改變函數的寫法或許能更有助於理解參數的按值傳遞。

function setName () {
 var obj = arguments[0];
 obj.name = 'Nicholas';
 obj = new Object();
 obj.name = 'Greg';
 return obj;
}

雖然變數person和參數obj的值一樣都是同一個物件在記憶體中的位址,但它們是兩個相互獨立的變數。如果在函數中改變參數obj的值,使其指向記憶體中另一個對象,變數person的值不會改變,還是指向原來的對象。

因此JavaScript中函數的參考類型值參數的傳遞是按值傳遞的。

結論

#

以上是詳解JavaScript函數參數的傳遞方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn