今天碰到一个问题,怎样把参数变更影响到函数外部,如:
<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程序设计有所帮助。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。