JavaScript函數(shù)參數(shù)的傳遞方式詳解
JavaScript使用一個(gè)變量對象來追蹤變量的生存期?;绢愋椭当恢苯颖4嬖谧兞繉ο髢?nèi);而引用類型值則作為一個(gè)指針保存在變量對象內(nèi),該指針指向?qū)嶋H對象在內(nèi)存中的存儲(chǔ)位置。
基本類型值的傳遞
向參數(shù)傳遞基本類型值時(shí),被傳遞的值會(huì)被復(fù)制給一個(gè)局部變量(即命名參數(shù),或者是arguments對象中的一個(gè)元素)。
function addOne (num) {
num++;
return num;
}
var count = 1;
var result = addOne(count);
console.log(count); //1
console.log(result); //2
在上面的例子中,變量count的值被傳遞給函數(shù)的參數(shù)num以便在函數(shù)中使用,此時(shí)變量count和參數(shù)num的值雖然是一樣的,但是它們是兩個(gè)相互獨(dú)立的變量,在函數(shù)中改變參數(shù)num的值并不會(huì)影響函數(shù)外部的變量count的值。
因此JavaScript中函數(shù)的基本類型值參數(shù)的傳遞是按值傳遞的。
引用類型值的傳遞
function setName (obj) {
obj.name = 'Nicholas';
}
var person = new Object();
setName(person);
console.log(person.name); //'Nicholas'
在上面的例子中,變量person的值被傳遞給函數(shù)的參數(shù)obj,此時(shí)在函數(shù)內(nèi)部為參數(shù)obj添加一個(gè)name屬性,函數(shù)對參數(shù)obj的使得函數(shù)外部的變量person也獲得了一個(gè)name屬性。從結(jié)果上看,JavaScript中函數(shù)的引用類型值參數(shù)的傳遞似乎是按引用傳遞的。
然而并非如此。變量person的值是引用類型值,因此它的值在變量對象中可以看做是一個(gè)實(shí)際對象在內(nèi)存中的地址(或指針)。傳遞參數(shù)以后參數(shù)obj的值是也是該對象在內(nèi)存中的地址,因此在函數(shù)中操作參數(shù)obj的值所引用的對象相當(dāng)于操作變量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'
如果參數(shù)傳遞是按引用傳遞的,在上面的例子中,函數(shù)改變了參數(shù)obj的值所引用的對象,那么相對應(yīng)的變量person的值所引用的對象也會(huì)改變。改變函數(shù)的寫法或許能更加有助于理解參數(shù)的按值傳遞。
function setName () {
var obj = arguments[0];
obj.name = 'Nicholas';
obj = new Object();
obj.name = 'Greg';
return obj;
}
雖然變量person和參數(shù)obj的值一樣都是同一個(gè)對象在內(nèi)存中的地址,但它們是兩個(gè)相互獨(dú)立的變量。如果在函數(shù)中改變參數(shù)obj的值,使其指向內(nèi)存中另外一個(gè)對象,變量person的值不會(huì)改變,還是指向原來的對象。
因此JavaScript中函數(shù)的引用類型值參數(shù)的傳遞是按值傳遞的。
結(jié)論
JavaScript中所有函數(shù)的參數(shù)都是按值傳遞的。
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
- JavaScript函數(shù)的調(diào)用以及參數(shù)傳遞
- JS中把函數(shù)作為另一函數(shù)的參數(shù)傳遞方法(總結(jié))
- javascript自定義函數(shù)參數(shù)傳遞為字符串格式
- js的函數(shù)的按值傳遞參數(shù)(實(shí)例講解)
- javascript arguments 傳遞給函數(shù)的隱含參數(shù)
- JS函數(shù)動(dòng)態(tài)傳遞參數(shù)的方法分析【基于arguments對象】
- 通過實(shí)例了解js函數(shù)中參數(shù)的傳遞
- 淺談JavaScript 函數(shù)參數(shù)傳遞到底是值傳遞還是引用傳遞
- javascript函數(shù)中參數(shù)傳遞問題示例探討
- js中對函數(shù)設(shè)置默認(rèn)參數(shù)值的3種方法
- 深入理解JavaScript函數(shù)參數(shù)(推薦)
- JS函數(shù)參數(shù)的傳遞與同名參數(shù)實(shí)例分析
相關(guān)文章
javascript實(shí)現(xiàn)前端input密碼輸入強(qiáng)度驗(yàn)證
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)前端input密碼輸入強(qiáng)度驗(yàn)證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
JavaScript中的常見問題解決方法(亂碼,IE緩存,代理)
這篇文章主要是對JavaScript中的常見問題解決方法(亂碼,IE緩存,代理)進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對大家有所 幫助2013-11-11
7個(gè)你應(yīng)該知道的JS原生錯(cuò)誤類型
這篇文章主要介紹了7個(gè)你應(yīng)該知道的JS原生錯(cuò)誤類型,對此感興趣的同學(xué),可以參考一下2021-04-04
學(xué)習(xí)JavaScript設(shè)計(jì)模式(代理模式)
這篇文章主要帶領(lǐng)大家學(xué)習(xí)JavaScript設(shè)計(jì)模式,其中重點(diǎn)介紹代理模式,對代理模式進(jìn)行詳細(xì)剖析,感興趣的小伙伴們可以參考一下2015-12-12
寫了一個(gè)layout,拖動(dòng)條連貫,內(nèi)容區(qū)可為iframe
寫了一個(gè)layout,拖動(dòng)條連貫,內(nèi)容區(qū)可為iframe...2007-08-08
談?wù)勎覍avaScript原型和閉包系列理解(隨手筆記8)
這篇文章主要介紹了談?wù)勎覍avaScript原型和閉包系列理解(隨手筆記8)的相關(guān)資料,需要的朋友可以參考下2015-12-12

