命名规则: 多单词组合,首字母小写,后面的单词首字母大写;
函数声明: 使用function关键字来声明,后跟函数名跟函数体。
//基本语法
function functionName(arg0,arg1,arg2,....,argN){
atatements
}
//函数示例
function sayHi(name,message){
alert("Hello"+name+","+message);
}
函数调用: 可以通过其函数名来调用。
sayHi("Nicholas","how are you today?");
函数的返回值: 任何函数任何时候都可以通过return语句后跟要返回的值来实现返回值。
//声明
function sum(num1,num2){
return num1+num2;
}
//调用
var result = sum (5,10);
结果:result 为15;
注意:函数在执行完return后会停止并立即退出。因此,位于return语句之外的任何代码都永远不会执行
function sum(num1,num2){
return num1+num2;
alert("Hello World"); //永远不会执行
}
一个函数中可以包含多个return语句:
function diff(num1,num2){
if(num1<num2){
return num2-num1;
}
else{
return num1-num2;
}
}
return语句可以不带有任何返回值: 函数在停止执行后,将返回undefined值。这种用法一般在需要提前停止函数执行而又不需要返回值的情况下。
函数定义的参数个数同函数调用时传递的参数个数可以不一致,对于参数的数据类型也没有要求;之所以会这样是因为ECMAscript中的参数在内部是用数组来表示的,函数接受到的始终是这个数组,而不关心数组中包含了哪些参数。
其实,arguments对象只是与数组类似(它并不是Array实例),可以使用[]来访问它的每一个元素,使用length属性来确定传递进来了几个参数。
之前的函数也可以改写为,即不显式地使用命名参数:
function sayHi(){
alert("Hello" + arguments[0] + "," + arguments[1]);
}
这个重写后的函数中不包含命名的参数,虽然没有name和message标识符,但函数的功能依旧。这个事实说明了ECMAscript函数的一个重要特点:命名参数只提供便利,但不是必需的。
通过访问arguments对象的length属性可以获知有多少个参数传递给了函数。
function howManyArgs(){
alert(arguments.length);
}
howManyArgs("Strings",45); //2
howManyArgs(); //0
howManyArgs(12); //1
可以利用这一点,让函数能够接受任意个参数并实现适当的功能。
function doAdd(){
if(arguments.length == 1){
alert(argument[0] + 10);
}else if(arguments.lengtn == 2){
alert(arguments[0] + arguments[1]);
}
}
doAdd(10); //20
doAdd(30,20); //50
arguments可以和命名参数一起使用:
function doAdd(num1,num2){
if(arguments == 1){
alert(num1 + 10);
}else(arguments == 2){
alert(arguments[0] + num2);
}
在本例中,arguments[0]与num1的值相同,arguments[1]与num2的值相同。
arguments的值永远与对应命名参数的值保持同步:
function doAdd(num1,num2){
arguments[1]=10;
alert(arguments[0]+num2);
}
//执行
doAdd(100,200);
结果为 110
;
每次执行这个doAdd()函数都会重写第二个参数,将第二个参数的值修改为10。因为arguments对象中的值会自动反映到对应的命名参数,所以修改arguments[1],也就是修改num2,结果他们的值都变成10。这并不是说读取这两个值会访问相同的命名空间;它们的内存空间值独立的,但它们的值会同步。但这种影响是单向的:修改命名参数不会改变arguments中对应的值。另外还要记住,如果只传了一个参数,那么为arguments[1]设置的值不会反应到命名参数中。这是因为arguments对象的长度是由传入的参数个数决定的,不是由定义函数时命名参数的个数决定的。
关于参数还要记住最后一点:没有传递的命名参数将自动赋予undefined值。这就跟定义了变量又没有初始化一样。
严格模式下,重写arguments的值会造成语法错误。
ECMAscript函数不能像传统意义上那样实现重载。
而在其他语言中,可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数类型和数量)不同即可。
如果在ECMAscript中定义两个相同的函数,那么后定义的函数会覆盖先定义的函数。
1、定义一组函数,输入数字,逆转并输出汉字形式
var str='';
function reserve(){
var num = window.prompt('请输入需要转换的数值:');
for(var i=num.length-1;i>=0;i--){
str+=transfer(num[i]);
}
document.write(str);
}
function transfer(target){
switch(target){
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 "玖";
}
}
//调用函数
reserve();
运行结果:
测试结果:玖八柒六伍肆叁贰壹
2、写一个函数,实现n的阶乘(递归)
function jc(n){
if(n==1){
return 1;
}
return n*jc(n-1);
}
3、写一个函数,实现斐波那qi数列
function fb(n){
if(n==1 || n==2){
return 1;
}
return fb(n-1)+fb(n-2);
}
4、挑战题:要求输入一串低于10位的数字,输出这串数字的中文大写。
例如:输入:10000输出:壹万
输入:1001010输出:壹佰万壹仟零壹拾