一、定义
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;
}