一、定义
function print(msg) { document.write(msg,"<br>"); } function distance(x1,y1,x2,y2) { var dx=x2-x1; var dy=y2-y1; return Math.sgrt(dx*dx+dy*dy); } function factorial(x) { if(x<=1) return 1; return x*factorial(x-1); } //调用 print("Hello"+name); print("Welcome to my blog"); total_dist=distance(0,0,2,1)+distance(2,1,3,5); print("The probability of that is:"+factorial(5)/factorial(13)); //嵌套的函数 function hypotenuse(a,b) { function square(x) { return x*x; } return Math.sqrt(square(a)+square(b)); }
二、可变长度的参数列表:Arguments 对象
//使用arguments 来验证调用函数时是否使用了正确数目的实际参数 function f(x,y,z) { if(arguments.length!=3) { throw new Error("functon f called with "+arguments.length+"arguments,but it expects 3 arguments."); } } //arguments 可以编写函数使之能够使用任意数目的实际参数 function max(/*...*/) { var m=Number,NEGATIVE_INFINITY; for(var i=0;i<arguments.length;i++) { if(arguments[i]>m) m=arguments[i]; return m; } } var largest=max(1,10,100,2,3,1000,4,5,10000,6); //这样的能够接受任意数目的参数被称作可变参数函数 //callee属性,用来引用当前正在执行的函数,可以用来允许对未命名的函数递归地调用自身 function(x) { if(x<=1) return 1; return x*arguments.callee(x-1); }
三、把对象属性用作参数
为了方便调用,使用下面的方法可以允许参数按照任意顺序以名字/值对的方式来传递
function arraycopy(/*array*/from,/*index*/from_start,/*array*/to,/*index*/to_strart,/*integer*/length) { //code goes here } function easycopy(args) { arraycopy( args.from, args.from_start||0, args.to, args.to_start||0, args.length;); } var a=[1,2,3,4]; var b=new Array(4); easycopy(from:a,to:b,length:4);
四、参数类型
//验证参数类型的函数,如果不能通过则中断执行 function sum(a) { if((a instanseof Array|| (a&&typeof a=="object"&&"length" in a)) { var total=0; for(var i=0;i<a.length;i++) { var element=a[i]; if(!element)continue; if(typeof element=="number") total+=element; else throw new Error("sum():all array elements must be numbers"); } return total; } else throw new Error("sum():argument must be an array"); } //以下函数可以接受任意多个参数,递归处理所有的数组类型的参数,在抛出一个错误之前,尽最大努力地把非数字值转换为数字 function flexisum(a) { var total=0; for(var i=0;i<arguments.length;i++) { var element=arguments[i]; if(!element) continue; var n; swith(typeof element) { case"number": n=element; break; case"object": if(element instanceof Array) n=flexisum.apply(this,element); else n=element.valueof(); break; case "function": n=element(); break; case"string": n=parseFloat(element); break; case"boolean": n=NaN; break; } else throw new Error("sum():can't convert "+element+" to number"); } return total; }