今天练习JavaWeb书上一个实例时发现一个问题,原代码如下:
<html> <head> <title>实时显示系统时间</title> <script language="javascript"> function realSysTime(clock){ var now=new Date(); //创建Date对象 var hour=now.getHours(); //获取小时 var minu=now.getMinutes(); //获取分钟 var sec=now.getSeconds(); //获取秒钟 var time=hour+":"+minu+":"+sec; //组合系统时间 clock.innerHTML="当前时间:"+time; //显示系统时间 } window.onload=function(){ window.setInterval("realSysTime(clock)",1000); //实时获取并显示系统时间 } </script> </head> <body> <div id="clock"></div> </body> </html>
其中关于实时显示系统时间语句,我想去掉window.set Interval(),改为只显示一次时间的语句:window.onload="realSysTime(clock); ",结果却一次时间都不显示.通过问老师和查资料(资料链接:https://zhidao.baidu.com/question/574426156.html?qbl=relate_question_3&word=javascript%20%CA%C2%BC%FE%D3%EB%BA%AF%CA%FD%B9%D8%C1%AA),我知道了应该加上function()匿名函数,改为window.onload=function(){realSysTime(clock); }就可以显示一次时间了(不刷新)。
我总结了一下原因是:(1)事件只能设置一个函数模板(无参),不能传递参数,如第一种定义function realSysTime(){...},调用window.onload=realSysTime;或者第二种定义function realSysTime(clock){...},调用window.onload=function(){realSysTime(clock);}(2)这里onload属性,需要赋给一个函数类型的值,才可以处理事件。匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。(3)但是realSysTime(clock); 并不是一个函数,你可以说你定义了realSysTime(clock);函数,但realSysTime(clock);也就是加了一对括号的realSysTime,是函数执行了,realSysTime(clock);是等价于realSysTime的返回值的。在realSysTime(clock);函数里,只是给id为clock的节点重新设置了内容,没有返回值,所以默认的就是undefined。虽然realSysTime(clock);不是函数,但realSysTime却是函数,是可以作为节点事件的处理函数的。(4)window.onload=window.setInterval("realSysTime(clock)",1000);实践证明window.setInterval函数是可以作为处理函数的。
所以有两种处理办法:1.window.onload=function(){realSysTime(clock); } 2.window.onload=realSysTime;