今天碰到一個問題,怎麼把參數變更影響到函數外部,如:
<script> var myname = "wood"; A(myname); document.write(myname); function A(n) { n = "Yao"; } </script>
輸出結果還是wood,說明當myname傳入A函數後,在函數體內,相當於有一個myname的副本,這個副本的值等於myname,之後在函數體內對其做的操作是在這個副本上進行的。
但情況有所不同,當傳入的參數是 陣列 、 物件 時,在函數體內對參數所做的變更會反映到原變數上。
<script> var myname = ["wood"]; A(myname); document.write(myname[0]); function A(n) { n[0] = "Yao"; } </script>
可以看出,上面程式碼中已經把friut陣列的第一個元素改變了。
以下是關於物件的例子:
<script> var myname = {name1:"wood"}; A(myname); document.write(myname.name1); function A(n) { n.name1 = "Yao"; } </script>
可以很明顯地看到函數體內對參數的改動影響到了原來的變量,這與通常情況下的傳參有質的區別了。需要特別注意。
But,當在函數體內對傳入的陣列或物件賦值時,這個變更不會反映到函數體外的原變數身上!
請看:
<script> var myname = {name1:"wood"}; A(myname); document.write(myname.name1); function A(n) { n = {name1:"Yao"}; } </script>
依照上面函數內部的變更會反映到原變數的理論,你一定覺得執行完A()後myname變數的name1屬性的值已經變成'Yao'了吧。但結果讓人有點難以接受。
原因在於,當函數體內使用賦值運算時,系統就建立了一個變數名為p的變數。這個p是函數內部的變量,對它賦值當然只在函數體內起作用,外面的myname還是原來的myname。
這一步驟與原來程式碼的操作差異僅在於在 函數體內是對參數賦新值呢還是對參數的屬性或陣列的元素進行更改 。
下面我們用傳遞物件的方式,重新實作一個時脈數字格式化輸出的例子:
<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,传入函数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()函數定時呼叫刷新事件,也可以用setTimeout()在getTime()中遞歸呼叫來實作。
以上就是本文的全部內容,希望對大家學習javascript程式設計有所幫助。