JavaScript對(duì)象參數(shù)的引用傳遞
今天碰到一個(gè)問題,怎樣把參數(shù)變更影響到函數(shù)外部,如:
<script>
var myname = "wood";
A(myname);
document.write(myname);
function A(n) {
n = "Yao";
}
</script>
輸出結(jié)果還是wood,說明當(dāng)myname傳入A函數(shù)后,在函數(shù)體內(nèi),相當(dāng)于有一個(gè)myname的副本,這個(gè)副本的值等于myname,之后在函數(shù)體內(nèi)對(duì)其做的操作是在這個(gè)副本上進(jìn)行的。
但情況有所不同,當(dāng)傳入的參數(shù)是 數(shù)組 、 對(duì)象 時(shí),在函數(shù)體內(nèi)對(duì)參數(shù)所做的更改會(huì)反映到原變量上。
<script>
var myname = ["wood"];
A(myname);
document.write(myname[0]);
function A(n) {
n[0] = "Yao";
}
</script>
可以看出,上面代碼中已經(jīng)把friut數(shù)組的第一個(gè)元素更改了。
下面是關(guān)于對(duì)象的例子:
<script>
var myname = {name1:"wood"};
A(myname);
document.write(myname.name1);
function A(n) {
n.name1 = "Yao";
}
</script>
可以很明顯地看到函數(shù)體內(nèi)對(duì)參數(shù)的改動(dòng)影響到了原來的變量,這與通常情況下的傳參有質(zhì)的區(qū)別了。需要特別注意。
But,當(dāng)在函數(shù)體內(nèi)對(duì)傳入的數(shù)組或?qū)ο筚x值時(shí),這個(gè)更改不會(huì)反映到函數(shù)體外的原變量身上!
請(qǐng)看:
<script>
var myname = {name1:"wood"};
A(myname);
document.write(myname.name1);
function A(n) {
n = {name1:"Yao"};
}
</script>
按照上面函數(shù)內(nèi)部的更改會(huì)反映到原變量的理論,你肯定覺得執(zhí)行完A()后myname變量的name1屬性的值已經(jīng)變成'Yao'了吧。但結(jié)果讓人有點(diǎn)難以接受。
原因在于,當(dāng)在函數(shù)體內(nèi)使用賦值操作時(shí),系統(tǒng)就創(chuàng)建了一個(gè)變量名為p的變量。這個(gè)p是函數(shù)內(nèi)部的變量,對(duì)它進(jìn)行賦值當(dāng)然只在函數(shù)體內(nèi)起作用,外面的myname還是原來的myname。
這一步與原來代碼的操作差別僅在于在 函數(shù)體內(nèi)是對(duì)參數(shù)賦新值呢還是對(duì)參數(shù)的屬性或數(shù)組的元素進(jìn)行更改 。
下面我們用傳遞對(duì)象的方式,重新實(shí)現(xiàn)一個(gè)時(shí)鐘數(shù)字格式化輸出的例子:
<script>
var mytime = self.setInterval(function() {
getTime();
}, 1000);
//alert("ok");
function getTime() {
var timer = new Date();
var t = {
h: timer.getHours(),
m: timer.getMinutes(),
s: timer.getSeconds()
}
//將時(shí)間對(duì)象t,傳入函數(shù)checkTime(),直接在checkTime()中改變對(duì)象中的值。
//而無需再去接收返回值再賦值
checkTime(t);
document.getElementById("timer").innerHTML = t.h + ":" + t.m + ":" + t.s;
}
function checkTime(i) {
if (i.h < 10) {
i.h = "0" + i.h;
}
if (i.m < 10) {
i.m = "0" + i.m;
}
if (i.s < 10) {
i.s = "0" + i.s;
}
}
</script>
例子使用setInterval()函數(shù)定時(shí)調(diào)用刷新事件,也可以用setTimeout()在getTime()中遞歸調(diào)用來實(shí)現(xiàn)。
以上就是本文的全部內(nèi)容,希望對(duì)大家學(xué)習(xí)javascript程序設(shè)計(jì)有所幫助。
- js函數(shù)的引用, 關(guān)于內(nèi)存的開銷
- 淺談JavaScript 函數(shù)參數(shù)傳遞到底是值傳遞還是引用傳遞
- 菜鳥學(xué)習(xí)JavaScript小實(shí)驗(yàn)之函數(shù)引用
- Javascript學(xué)習(xí)筆記之 函數(shù)篇(三) : 閉包和引用
- Js從頭學(xué)起(基本數(shù)據(jù)類型和引用類型的參數(shù)傳遞詳細(xì)分析)
- js中判斷Object、Array、Function等引用類型對(duì)象是否相等
- JavaScript 類的定義和引用 JavaScript高級(jí)培訓(xùn) 自定義對(duì)象
- javascript引用對(duì)象的方法
- JavaScript對(duì)象引用與賦值實(shí)例詳解
- javascript引用對(duì)象的方法代碼
- js中值引用和地址引用實(shí)例分析
相關(guān)文章
javascript使用正則獲取url上的某個(gè)參數(shù)
使用indexOf取得?之后的參數(shù),以&使split進(jìn)行分割成數(shù)組,下面展示了一個(gè)從url上獲取名為MenuCode參數(shù)的過程2014-09-09
文件上傳,iframe跨域數(shù)據(jù)提交的實(shí)現(xiàn)
下面小編就為大家?guī)硪黄募蟼?iframe跨域數(shù)據(jù)提交的實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11
利用JavaScript差集實(shí)現(xiàn)一個(gè)對(duì)比小工具
這篇文章主要給大家介紹了關(guān)于利用JavaScript差集實(shí)現(xiàn)一個(gè)對(duì)比小工具的相關(guān)資料,雖然實(shí)現(xiàn)的界面不是太好看,但好在功能實(shí)用即可,需要的朋友可以參考下2021-07-07
JavaScript控制網(wǎng)頁平滑滾動(dòng)到指定元素位置的方法
這篇文章主要介紹了JavaScript控制網(wǎng)頁平滑滾動(dòng)到指定元素位置的方法,實(shí)例分析了javascript操作頁面滾動(dòng)的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
javascript如何實(shí)現(xiàn)create方法
這篇文章主要介紹了javascript如何實(shí)現(xiàn)create方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
JS實(shí)現(xiàn)根據(jù)指定值刪除數(shù)組中的元素操作示例
這篇文章主要介紹了JS實(shí)現(xiàn)根據(jù)指定值刪除數(shù)組中的元素操作,結(jié)合實(shí)例形式總結(jié)分析了JavaScript針對(duì)數(shù)組元素刪除操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-08-08
JS跨域解決方案之使用CORS實(shí)現(xiàn)跨域
正常使用AJAX會(huì)需要正??紤]跨域問題,所以偉大的程序員們又折騰出了一系列跨域問題的解決方案,如JSONP、flash、ifame、xhr2等等。本文給大家介紹JS跨域解決方案之使用CORS實(shí)現(xiàn)跨域,感興趣的朋友參考下吧2016-04-04
javascript實(shí)現(xiàn)table單元格點(diǎn)擊展開隱藏效果(實(shí)例代碼)
這篇文章主要介紹了javascript實(shí)現(xiàn)table單元格點(diǎn)擊展開隱藏效果的實(shí)例代碼講解,代碼簡單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-04-04

