日期:2014-05-16  浏览次数:20360 次

(10)JavaScript学习笔记 - 函数

一、定义

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;
}