JavaScript對象參數(shù)的引用傳遞
今天碰到一個問題,怎樣把參數(shù)變更影響到函數(shù)外部,如:
<script> var myname = "wood"; A(myname); document.write(myname); function A(n) { n = "Yao"; } </script>
輸出結(jié)果還是wood,說明當myname傳入A函數(shù)后,在函數(shù)體內(nèi),相當于有一個myname的副本,這個副本的值等于myname,之后在函數(shù)體內(nèi)對其做的操作是在這個副本上進行的。
但情況有所不同,當傳入的參數(shù)是 數(shù)組 、 對象 時,在函數(shù)體內(nèi)對參數(shù)所做的更改會反映到原變量上。
<script> var myname = ["wood"]; A(myname); document.write(myname[0]); function A(n) { n[0] = "Yao"; } </script>
可以看出,上面代碼中已經(jīng)把friut數(shù)組的第一個元素更改了。
下面是關(guān)于對象的例子:
<script> var myname = {name1:"wood"}; A(myname); document.write(myname.name1); function A(n) { n.name1 = "Yao"; } </script>
可以很明顯地看到函數(shù)體內(nèi)對參數(shù)的改動影響到了原來的變量,這與通常情況下的傳參有質(zhì)的區(qū)別了。需要特別注意。
But,當在函數(shù)體內(nèi)對傳入的數(shù)組或?qū)ο筚x值時,這個更改不會反映到函數(shù)體外的原變量身上!
請看:
<script> var myname = {name1:"wood"}; A(myname); document.write(myname.name1); function A(n) { n = {name1:"Yao"}; } </script>
按照上面函數(shù)內(nèi)部的更改會反映到原變量的理論,你肯定覺得執(zhí)行完A()后myname變量的name1屬性的值已經(jīng)變成'Yao'了吧。但結(jié)果讓人有點難以接受。
原因在于,當在函數(shù)體內(nèi)使用賦值操作時,系統(tǒng)就創(chuàng)建了一個變量名為p的變量。這個p是函數(shù)內(nèi)部的變量,對它進行賦值當然只在函數(shù)體內(nèi)起作用,外面的myname還是原來的myname。
這一步與原來代碼的操作差別僅在于在 函數(shù)體內(nèi)是對參數(shù)賦新值呢還是對參數(shù)的屬性或數(shù)組的元素進行更改 。
下面我們用傳遞對象的方式,重新實現(xiàn)一個時鐘數(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() } //將時間對象t,傳入函數(shù)checkTime(),直接在checkTime()中改變對象中的值。 //而無需再去接收返回值再賦值 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ù)定時調(diào)用刷新事件,也可以用setTimeout()在getTime()中遞歸調(diào)用來實現(xiàn)。
以上就是本文的全部內(nèi)容,希望對大家學習javascript程序設計有所幫助。
- js函數(shù)的引用, 關(guān)于內(nèi)存的開銷
- 淺談JavaScript 函數(shù)參數(shù)傳遞到底是值傳遞還是引用傳遞
- 菜鳥學習JavaScript小實驗之函數(shù)引用
- Javascript學習筆記之 函數(shù)篇(三) : 閉包和引用
- Js從頭學起(基本數(shù)據(jù)類型和引用類型的參數(shù)傳遞詳細分析)
- js中判斷Object、Array、Function等引用類型對象是否相等
- JavaScript 類的定義和引用 JavaScript高級培訓 自定義對象
- javascript引用對象的方法
- JavaScript對象引用與賦值實例詳解
- javascript引用對象的方法代碼
- js中值引用和地址引用實例分析
相關(guān)文章
js中Number數(shù)字數(shù)值運算后值不對的解決方法
下面小編就為大家?guī)硪黄猨s中Number數(shù)字數(shù)值運算后值不對的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02javascript字母大小寫轉(zhuǎn)換的4個函數(shù)詳解
這篇文章主要介紹了javascript字母大小寫轉(zhuǎn)換的4個函數(shù)詳解,需要的朋友可以參考下2014-05-05