![动态网页设计与开发:JavaScript + jQuery](https://wfqqreader-1252317822.image.myqcloud.com/cover/481/32441481/b_32441481.jpg)
3.2 JavaScript函数
3.2.1 常用定时函数
在前面的示例中,时间是静止的,不能动态更新。若要像电子表一样不停地动态改变时间,则需要使用将要学习的定时函数。JavaScript中提供了两个定时函数setTimeout()和setInterval()。此外,还提供了用于清除定时器的两个函数clearTimeout()和clearInterval()。
1.setTimeout()
setTimeout()用于在指定的毫秒后调用函数或计算表达式,语法格式如下:
语法
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_73_1.jpg?sign=1738936558-ifISnLVfzo3I6AMgtMcUJDoUmcRFy5OB-0-61d3dde4603b271aeb13769a9dd45837)
下面使用setTimeout()函数实现3秒后弹出提示框,代码如示例10所示。
【示例10】 定时函数
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_73_2.jpg?sign=1738936558-3hnusVdQ31eUHq14yM9fVSxB5N33Bivt-0-3c412ab7d1ba8bf1af4201af2ba3bd95)
➢ 3000表示3000毫秒,即3秒。
➢ 点击“显示提示消息”按钮调用timer()函数时,弹出一个警告提示框,由于使用了setTimetout()函数,因此调用函数timer()后,需要等待3秒,才能弹出警告提示框。
在浏览器中运行并点击“显示提示消息”按钮,等待3秒后,弹出如图3.12所示的警告提示框。
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_73_3.jpg?sign=1738936558-491zuF2Kbdl7wVP5X13AsAzT44AfULa1-0-00822104181e8b038ce39b04894bd123)
图3.12 等待3秒弹出提示
2.setInterval()
setInterval()可按照指定的周期(以毫秒计)来调用函数或计算表达式,语法格式如下:
语法
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_73_4.jpg?sign=1738936558-McGl68MtK86rvOv07P3ZkafcUwPuYARF-0-aeb63ebf43000ab675df192793fded15)
setInterval()会不停地调用函数,直到窗口被关闭或被其他方法强制停止。在示例10的代码中将setTimeout()函数改为使用setInterval()函数,修改后的代码如下所示:
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_73_5.jpg?sign=1738936558-UBVWRDvSC5Al4Mc5rjKPAXog6F1Jeld0-0-79e2585ff5319d3998fbae26fcf1d4a2)
在浏览器中重新运行上面的示例10,点击“显示提示消息”按钮,等待3秒后,弹出如图3.12所示的提示框。关闭此提示框后,间隔3秒后又会弹出提示框……只要把弹出的提示框关闭,3秒后就会再次弹出提示框。
提示
setTimeout()只执行一次函数,如果要多次调用函数,则需要使用setInterval()或者让被调用的函数再次调用setTimeout()。
知道了函数setInterval()的用法,现在将示例5改成时钟特效的效果,使时钟“动起来”,实现思路就是每过1秒都要重新获得当前时间并显示在页面上,修改后的代码如示例11所示。
【示例11】 时钟特效动起来
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_74_1.jpg?sign=1738936558-BoHs8ylksu4xflL1pJ7fpORxt3L16JcZ-0-155ff036ed11ce9d0bb3b8b7e0709247)
在浏览器中运行此示例11,时钟已经“动起来”,达到了真正的时钟特效。
3.clearTimeout()和clearInterval()
clearTimeout()函数用来清除由setTimeout()函数设置的定时器,语法格式如下:
语法
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_74_2.jpg?sign=1738936558-oDZfumM27oNrp5z0gJ6bULZgVeYnvDO2-0-62c8bffa230d5540ceb94d914c60624f)
clearlnterval()函数用来清除由setInterval()函数设置的定时器,语法格式如下:
语法
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_74_3.jpg?sign=1738936558-kM1EoXwLS9SFi8Uqm0dyPy5OdzxmO9vn-0-164b2fada2743f798fe1dc65129e5add)
现在将示例11实现的效果加一个需求,即通过点击“停止”按钮停止时钟特效,代码修改如示例12所示。
【示例12】 清除时钟特效
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_74_4.jpg?sign=1738936558-3KBuno5b4xJmmmWM7805DCYH2x0iSZ16-0-c73d4823a3b093e6145f3db9a5de6ac0)
3.2.2 技能训练1
上机练习2 制作十二进制的时钟特效
训练要点
➢ Date对象的使用。
➢ setInterval()方法的使用。
需求说明
➢ 制作显示年、月、日、星期,并且显示上午(AM)和下午(PM)的十二进制的时钟,如图3.13所示。
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_75_1.jpg?sign=1738936558-f4944w2eCxkUMZpwHtcDuAszoBNAKNKp-0-1b4db08516bae460bf95018248b92d99)
图3.13 十二进制的时钟
代码实现思路及关键代码
(1)创建一个Date()对象,如var today=new Date()。
(2)通过Date对象的getFullYear()方法获得年份数,通过getMonth()方法获得月份数(0~11),通过getDate()方法获得天数,通过getDay()方法获得一个星期中的第几天,从0开始到6结束。
(3)通过getHours()方法获得当前小时数,通过getMinutes()方法获得当前分钟数,通过getSeconds()方法获得当前秒数。
(4)使用if语句判断当前小时是否大于12,如果大于12,则为下午;否则为上午。
(5)使用setInterval()设置每间隔指定毫秒后调用clock_12h(),代码如下所示。
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_75_2.jpg?sign=1738936558-KTPSeDEQrSSolfAeKPc9WLaRGp3hXenl-0-1ce6727f9f53ca46e999d3987e84c2d5)
3.2.3 自定义函数
1.函数的基本结构
函数是在调用时才会执行的一段代码块,可以重复使用。其基本语法结构如下:
语法
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_75_3.jpg?sign=1738936558-1Roh8ZF33lOTNhMSHndMOqQh7fZshOwA-0-6095681f4625b2e16ea5a857d02c5b0a)
上述语法结构是由关键字function、函数名称、小括号内的一组可选参数以及大括号内的待执行代码块组成的。其中函数名称和参数个数均可以自定义,待执行的代码块可以由一句或多句JavaScript代码组成。
➢ function是定义函数的关键字,必须有。
➢ 函数名:可由大小写字母、数字、下划线(_)和$符号组成,但是函数名不能以数字开头,且不能是JavaScript中的关键字。
➢ 参数:是外界传递给函数的值,它是可选的,多个参数之间使用“,”分隔。参数0、参数1等是函数的参数。因为JavaScript本身是弱类型,所以它的参数也没有类型检查和类型限定。函数中的参数是可选的,根据是否带参数,函数可分为无参函数和有参函数。
➢ “{”和“}”定义了函数的开始和结束。
➢ 函数体:是专门用于实现特定功能的主体,由一条或多条语句组成。
➢ 返回值:在调用函数后若想得到处理结果,可在函数体中用return关键字返回。
2.参数设置
函数在定义时根据参数的不同,可分为两种类型,一种是无参函数,一种是有参函数。在定义有参函数时,设置的参数称为形参,函数调用时传递的参数称为实参。所谓形参指的就是形式参数,具有特定的含义;实参指的是实际参数,也就是具体的值。接下来将分别介绍几种常用的函数参数设置。
(1)无参函数
无参函数适用于不需要提供任何数据,即可完成指定功能的情况。
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_76_1.jpg?sign=1738936558-jD2uNz8FUxavlpOMNKCXn8Knzps6eKsl-0-a50db371b793b1b025fe6cce4f6282dd)
具体示例如下:
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_76_2.jpg?sign=1738936558-e5D6ipHqzx09qixWqMIcCdzba6RF2HSg-0-cdac2531ca910464380dec34982b41b5)
上述代码定义了一个名称为welcome的函数,该函数的参数个数为0。在待执行的代码部分只有一句alert()方法,用于在浏览器中弹出提示框并显示双引号内的文本内容。
需要注意的是,在自定义函数时,即使函数的功能实现不需要设置参数,小括号“()”也不能够省略。
(2)有参函数
在项目开发中,若函数体内的操作需要用户传递数据,此时函数定义时需要设置形参,用于接收用户调用函数时传递的实参。如果需要弹出的提示框每次显示的文本内容不同,可以使用参数传递的形式:
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_76_3.jpg?sign=1738936558-J8Aszs5jZp1a0O1yRPWPAEL2UX5n3YuP-0-3122ab86b14e2c42eee603e55b49985a)
此时为之前的welcome函数方法传递了一个参数msg,在待执行的代码部分修改原先的alert()方法,用于在浏览器上弹出提示框并动态显示msg传递的文本内容。
(3)获取函数调用时传递的所有实参
在开发时若不能确定函数的形参个数,此时定义函数时可以不设置形参,在函数体中直接通过arguments对象获取函数调用时传递的实参,实参的总数可通过length属性获取,具体的实参值可通过数组遍历的方式进行操作,示例如下:
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_76_4.jpg?sign=1738936558-imUdqc7ijIJGPqrIwtMBk0blNdSiMlSV-0-4e6d0e4db088b5fb0684317ff67f1ddd)
3.函数的调用
函数可以通过使用函数名称的方法进行调用。例如:
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_76_5.jpg?sign=1738936558-YcB4NQKubItXhqfNaKAnU5kXNf8HK0Z3-0-8a9a9094372e4a2ff1f49fd53f73abf1)
如果该函数存在参数,则调用时必须在函数的小括号内传递对应的参数值,如下所示:
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_76_6.jpg?sign=1738936558-LgF3ipubuqW2N9vGElHI0efGf2qiVY8Y-0-f242d5dd1dde5078d6bb6b67230c251c)
函数可以在JavaScript代码的任意位置进行调用,也可以在指定的事件发生时调用。例如在按钮的点击事件中调用函数:
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_76_7.jpg?sign=1738936558-bBObtEVTeJEJ0YGYVvBHPyGq9zbfednc-0-ecc299500ec6dca2095408e191b5069b)
上述代码中的onclick属性表示元素被鼠标点击的状态触发等号右边的函数内容。
【示例13】 JavaScript函数的简单调用
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_76_8.jpg?sign=1738936558-JNpb0Ivqynbpkyv5ZJ1uFSHe6N6PokJV-0-c3d21c5c67d130ece9e3b6ee28abb342)
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_77_1.jpg?sign=1738936558-Wu2B3mngNaUqFSUnV3LhuLF3W5SNFmq7-0-1bdc4bbb78d74fa962463cbd5e2be928)
示例13在浏览器中的运行效果如图3.14所示。
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_77_2.jpg?sign=1738936558-lXPcMMzkEQI0Y23Lsa72eod9IVAQRmtV-0-ed36c5720b74d8065ff08d0d3e9f823b)
图3.14 示例13运行效果
4.函数的返回值
相比Java而言,JavaScript函数更加简便,无须特别声明返回值类型。JavaScript函数如果存在返回值,直接在大括号内的代码块中使用return关键字后面紧跟需要返回的值即可。例如:
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_77_3.jpg?sign=1738936558-kwJFci4YfMV05b5zLg48MfhqFHmeVQPW-0-8c64665e4016291f80fb819c1a2866e9)
上述代码对两个数字进行了求和运算,使用自定义变量result获取total函数的返回值。此时在total函数的参数位置填入了两个测试数据,得到了正确的计算结果。函数也可以带有多个return语句:
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_77_4.jpg?sign=1738936558-3YPSvqXYcttHVyBfXK4eXg5wknz6e3YR-0-493b8c9dadd34a437b61f1c2da8d9dfe)
上述代码对两个数字进行了比较运算,然后返回其中较大的数值。使用自定义变量result获取maxNum函数的返回值。此时在maxNum函数的参数位置填入了两个测试数据,得到了正确的计算结果。单独使用return语句可随时终止函数代码的运行。例如测试数值是否为偶数,如果是奇数则不提示,如果是偶数则弹出提示框:
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_77_5.jpg?sign=1738936558-xXbqVhtDIAUw2PcTn8JpkGWsbkJ6qNCG-0-59684699af81677f6bc815d6371cec12)
函数在执行到return语句时就直接退出了代码块,即使后续还有代码也不会被执行。本例中如果参数为奇数才能符合if条件然后触发return语句,因此后续的alert()方法不会被执行到,从而做到只有在参数为偶数时才显示提示框。
【示例14】 JavaScript带有返回值函数的应用
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_77_6.jpg?sign=1738936558-7Oa9rt05oit01GHVQoj260R5DGgRBip2-0-f95cd4609292a041365ef037adb91b87)
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_78_1.jpg?sign=1738936558-sYsipiniRU7lMt77ZGWZ5oEFhzCy26uy-0-4671c5fccaf5afa3ab69613913b3fb8e)
示例14在浏览器中的运行效果如图3.15所示。
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_78_2.jpg?sign=1738936558-ZPOol2ug1dsasqgTx4008iUAHQvFCjwd-0-5c6608c80e9d32afd36fcb799f805d38)
图3.15 示例14运行效果
5.函数简单应用
下面通过示例15和示例16来学习如何定义和调用函数。
【示例15】 JavaScript无参函数的应用
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_78_3.jpg?sign=1738936558-GSrizBshkKqU27XfQLAsFnDpwYWmrB06-0-e0953c451d182bbeb2c741af2645f333)
study()是创建的无参函数,onclick表示按钮的点击事件,当点击按钮时调用函数study()。在浏览器中运行示例15,如图3.16所示,点击“显示5次欢迎学习JavaScript”按钮,调用无参函数study(),在页面中循环输出5行“欢迎学习JavaScript”。
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_78_4.jpg?sign=1738936558-f3McKZK22iR4p0T2qDBkprbYJ0H5nAVc-0-c47dbbb726e9c88d2b49dfce9884b28c)
图3.16 调用无参函数
在示例15中使用的是无参函数,运行一次,页面只能输出5行“欢迎学习JavaScript”,如果需要根据用户的要求每次输出不同行数,该怎么办呢?有参函数可以实现这样的功能。下面修改示例15,把函数study()修改成一个有参函数,使用prompt()提示用户每次输出"欢迎学习JavaScript"的行数,然后将prompt()方法返回的值作为参数传递给函数study()。
【示例16】 JavaScript有参函数的应用
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_78_5.jpg?sign=1738936558-QNRqlqE1FW4u37qw26gucdzPM9sIOYqE-0-860af753b8af20d0fcd5b28b20c0699a)
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_79_1.jpg?sign=1738936558-Sxx0eA6WqxjWNBlShvdOK2BLwNIw514B-0-59e7dc8e1125325814724c08980e6231)
count表示传递的参数,不需要定义数据类型,将prompt()方法返回的值作为参数传递给函数study(count)。
在浏览器中运行示例16,点击页面上的按钮,弹出提示用户输入显示欢迎学习JavaScript次数的提示框,用户输入值后,根据用户输入的值在页面上输出欢迎学习JavaScript,如图3.17所示。
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_79_2.jpg?sign=1738936558-0DjImZxDF4N6B5IZ5QR8jHyrAOxctPDY-0-4ff4a9136a2eeda93e549390c2f22356)
图3.17 动态显示欢迎学习JavaScript
6.变量的作用域
与Java中的变量一样,在JavaScript中,根据变量作用范围不同,可分为全局变量和局部变量。JavaScript中的全局变量,是在所有函数之外的脚本中声明的变量,作用范围是该变量定义后的所有语句,包括其后定义的函数中的代码,以及其后的<script>与</script>标签中的代码。
JavaScript中的局部变量,是在函数内声明的变量,如示例15代码中study()函数中声明的"var i=0;",只有在该函数中且位于该变量之后的代码中可以使用这个变量,如果在之后的其他函数中声明了与这个局部变量同名的变量,则后声明的变量与这个局部变量毫无关系。
请使用断点调试的方式运行示例,分析全局变量和局部变量的作用。
【示例17】 JavaScript变量的作用域
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_79_3.jpg?sign=1738936558-9JZCSLOIBYnNgbOhkC4QU9J45InAygUh-0-f81caa8703e1c24b2277e04f10e5b4e6)
运行示例,在prompt()弹出的输入框中输入67,点击“确定”按钮,运行结果如图3.18所示。
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_79_4.jpg?sign=1738936558-8yToU44Z1bdNT5YTRvH2Nk9UwSjdTcym-0-2632bf3b38ca0a25f96be745f474f84d)
图3.18 变量的作用范围
这里使用了onload事件,onload事件会在页面加载完成时立即发生。将断点设置在var i=20;这一行,单步运行。我们会发现,先执行var i=20,设置i为全局变量,再运行onload事件调用second()函数,在函数中,因为输入的值67大于20,所以执行else语句,即在页面中输出了67。然后执行函数first(),在函数first()中,声明i为局部变量,它只作用于函数first(),因此for循环输出了0、1、2、3、4。
3.2.4 技能训练2
上机练习3 编写一个max(x,y,z)的JavaScript函数
需求说明
➢ 试创建一个名称为max(x,y,z)的JavaScript函数,其返回值为x、y、z中的最大值
➢ 使用alert语句显示2、30、99这三个数中的最大值。
上机练习4 字符串大小写转换
需求说明
➢ 编写HTML表单,设置两个文本框和两个按钮,文本框显示转换前后数据,按钮用于转换。
➢ 为按钮添加点击事件,并利用函数deal()来处理。
➢ 编写deal()函数,根据传递的不同参数执行不同的转换操作。
➢ 将转换后的数据显示到对应位置。
➢ 运行后结果如图3.19所示。
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_80_1.jpg?sign=1738936558-zMtdS5b4Nt3bB0aNGYpdO7RAttWuk5oZ-0-138b0999982624cc21d4dfc02e88f418)
图3.19 字符串大小写转换
上机练习5 编写一个四则运算函数
需求说明
➢ 点击页面上的按钮时,调用函数,使用prompt()方法获取两个变量的值和一个运算符,如图3.20所示。
➢ 运算结果使用alert()方法显示出来,如图3.21所示。
➢ 使用switch判断获取的运算符号。
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_80_2.jpg?sign=1738936558-8kJ9dP5BNCn53HnaXb6LN1e34oH1BaMn-0-70f032f4a3275834c45d0673f9623022)
图3.20 输入数值和运算符
![](https://epubservercos.yuewen.com/DE91A3/17518673407512906/epubprivate/OEBPS/Images/39132_80_3.jpg?sign=1738936558-y2KNS36400fDJCOeQCKRbeYKOpeZfsDj-0-291886fd3c84b207793cfd9a2c3e7862)
图3.21 显示两数的运算结果