函数就是像这样:
//函数定义
function NumToChinese(number){
switch(number){
case 0:
return "零";
case 1:
return "一";
case 2:
return "二";
case 3:
return "三";
case 4:
return "四";
case 5:
return "五";
case 6:
return "六";
case 7:
return "七";
case 8:
return "八";
case 9:
return "九";
}
}
//函数调用
alert(NumToChinese(5));
alert(NumToChinese(3));
这是一个把0-9数字转换成汉字的函数。由于很多地方都需要把数字转换成汉字,在每一
个需要的地方照抄这一段代码,不如定义成一个函数,需要的地方调用即可。
语法格式是:
Function 函数名(形式参数1, 形式参数2……){
函数体
}
在函数体中,可以使用形式参数,如本例中的number。形式参数可以有0到多个,用逗号
隔开。调用函数时,需将实际参数按正确的顺序填写, 用逗号隔开,这样调用函数者可以
把数据传入函数体。
函数一般都有一个“返回值”,且最多只有一个返回值。本例中,转换后的汉字字符就是
返回值。函数体中运行到“return 返回值;”时,就结束本次函数运行,返回这个值。这
也是为什么在本例的switch-case 语句中不需要加break;的原因。
在调用函数的代码中,可以直接把函数调用当作表达式使用。
函数所做的工作不仅仅是返回一个值,函数体中可以使用函数外面的变量等等,所以即使
没有返回值,也可以做了很多工作。就像你派一名特工前去炸毁敌人弹药库,特工历尽艰
辛,最后与弹药库同归于尽,没有返回值。
程序自然运行到函数体末端,就会自然返回,结束函数运行,没有返回值。也可以用:
renturn; 来做一个没有返回值的返回。
调用没有返回值的函数,或者不理会函数的返回值,可以:
函数名(参数);
即可。
一般来说,函数最好有一个返回值,例如可以是工作成功或失败,成功则返回0,失败则
返回一个错误码,以便分析出错原因。
各种程序语言中都有函数,但是javascript的函数语法与java有很大的不同。在
java中,函数的返回值类型、参数数目、各个参数的类型必须准确定义,调用时也必须严
格对应,否则就会驴唇不对马嘴。在java中,函数名相同但参数数目或类型不同的函数被
认为是两个不同的函数。而在javascript中,同名就是同一个函数,所以函数起名不能重
名,调用函数甚至可以缺参数,例如定义一个函数 function 打酱油(几瓶, 什么牌子),
调用时可以:打酱油(1); 不填什么牌子的酱油,程序就随便买一瓶回来。这样的语法体
现了微软公司的“拍马屁”作风,但我认为这一点上是拍到马蹄子上了。也可能
javascript本来只是设计为在网页里搞点小动作,哪里想到后来发展成包罗万象不所不能
。至少在初期的编程练习中,慎用这种缺参数的函数调用。
javascript系统提供了很多现成的函数,供你调用,就不用你自己写了,有的自己也写不
出来。例如parseInt 用来把别的类型的值转换成整数,Math.random 产生一个0-1之间的
随机数,这样当需要产生一个0-99的随机整数时:
XXX = parseInt(Math.random()*100);
还有isNaN(参数1)判断是否是合法的整数,返回一个布尔值,在上一节的例子
中有应用。
各种系统函数,需要时可以随时查询,这里不可能全部介绍。
写函数的目的,是提高内聚度、提高代码复用。代码复用比较容易理解,辛苦写
出的东东,如果别人也能拿来用,提高下利用率,当然比较合算。高内聚就是说,有8个
地方需要做同样的处理,如果写成一个函数,那么处理方法发生变动的时候,只要改这个
函数一处地方即可,不必8个地方都改。
但是也应该有令人纠结的情况。函数用的人多了,就会有“众口难调”的问题,
为了这部分人的需要做了修改,可能使另一部分人调用时出错。没办法,加参数吧。例如
,前面的例子,现在有人需要转换成大写汉字,“壹贰叁”什么的,可以加一个参数,变
成:
function NumToChinese(number,ifBig)
增加一个ifBig参数来表示是否要转成大写。这样一来,原来转小写的调用就要增加参数
。这可能是为什么javascript允许参数不全的调用执行。其实也有简单的解决办法,将原
来的函数体搬进一个新的函数:
function NumToChinese2(number,ifBig)
并增加对大小写的判断和处理。
然后原来的函数体改成:
function NumToChinese(number){
return NumToChinese2(number,false);
}
即可。
有时需要权衡,是不是新增一个函数叫NumToBigChinese,和原来的函数毫无关
系。这样做的优点是完全不影响原来的功能,坏处是如果现在要求不论哪种转换都要在前
面加上一个空格,那就要记得改两处地方。权衡的原则,是这两种功能是不是在应用上是
相同性质的功能,用在相同性质的场合。如果两个功能只是在运转上有类似的地方,例如
电话和计算器都有带数字的按钮,那最好分开写,不要怕多几行代码,避免改了计算器导
致电话打不通的情况。
练习题:
假设现在要要举行程序设计比赛,比赛项目为“剪刀/锤子/布”游戏,两名选手同时出牌
,如果出牌相同都得0分,否则布赢锤子1分,锤子赢剪刀1分,剪刀赢布1分。每个参赛者
提交一个函数,调用时返回一个“剪刀/锤子/布”的选择,然后选手A的函数和选手B的函
数与裁判代码放在一起运行,对战10次,然后给出两名选手的得分。
在本次练习中,需要编写以下内容:
1, 记录两名选手得分的变量,根据两名选手的出牌裁决得分的函数。
2, 选手A的出牌函数:出锤子的概率40%,剪刀和布30%。
3, 选手B的出牌函数:随便写吧,别返回非法值即可。例如,第一轮出锤子,第二
轮开始A在前一轮出什么B就出什么。
4, 对战10次(或者随便多少次吧),每次对战后,在两个变量里分别公布两名选手的
出牌,以供两名选手的function参考决策之后的出牌,最后给出两名选手的总得分。
--
FROM 114.251.89.*