当前位置: 代码迷 >> Web前端 >> 函数的参数跟Arguments对象
  详细解决方案

函数的参数跟Arguments对象

热度:418   发布时间:2012-10-29 10:03:53.0
函数的参数和Arguments对象
  在javascript中,出现在函数定义文法中的参数列表是函数的形式参数,简称形参,一个函数可以有一个或者多个形参,函数对象定义时的形参数量可以通过length属性获得,例如
function add(x,y){
	return x+y;
}
window.cross=function(v1,v2){
	return v1*2+v2*1;
}
document.write('max_lenght='+max.length+'<br>');//max_lenght=2
document.write('wds_cross_length='+window.cross.length);//wds_cross_length=2 

  函数调用时传入的参数是函数的实际参数,简称实参,一般情况下,实参和形参的数量是相同的,但在javascript的中并不强求这一点,函数的形参和实参数量可以不相同。如果实参少于形参,则多余的形参值为undefined(也可以通过缺省参数来改变多余形参的值,如下例);如果函数实参多于形参,则多出来的那一部分不能通过形参标识符来访问。
function add(x,y){
	if(!y){
		y=0;
	}
	return x+y;
}
document.write('add_value='+add(2)+'<br>');//add_value=2
document.write('add_value='+add(2,4)+'<br>');//add_value=6

  Arguments对象是一个集合,,可以按照数字下标获取传递给函数的参数值。例如arguments.length可以获得传递给函数的参数的个数,如果希望函数的形参个数和实参个数相同,可以通过通过访问函数的length和arguments的length进行比较。由于可以通过length的属性的到长度和通过下标访问,Arguments的行为有点像数组,但他其实并不是数组,它不具备JAVASCRIPT核心数组的一些方法,如join、sort、slice等。
  Arguments的一个重要功能是用来实现接受多种不同类型不同数目实参的函数,类似于重载。
function Point(){
	if(arguments.length==0){
		this.x=0;
		this.y=0;
	}else if(arguments.length==1){
		var p=arguments[0];
		if(p instanceof Point){
			this.x=p.x;
			this.y=p.y;
		}else if(typeof(p)=="number" || p instanceof Number){
			this.x=Number(p);
			this.y=0;
		}else{
			throw new TypeError("参数类型错误");//如果这个参数既不是Point又不是Number,抛出类型错误异常。
		}
	}else if(arguments.length==2){
		var x=arguments[0];
		var y=arguments[1];
		if((typeof(x)=="number"||x instanceof Number)&&typeof(y)=="number"||y instanceof Number){
			this.x=x;
			this.y=y;
		}else{
			throw new TypeError("参数类型错误");
		}
	}else{
		throw new TypeError("参数类型错误");
	}
}
try{
	var x =new Point(2,3);
	document.write("x="+x.x+"<br>");
	document.write("y="+x.y+"<br>");
	document.write("****************"+"<br>");
	x =new Point(new Point(4,6));
	document.write("x="+x.x+"<br>");
	document.write("y="+x.y+"<br>");
	document.write("****************"+"<br>");
	x =new Point(10);
	document.write("x="+x.x+"<br>");
	document.write("y="+x.y+"<br>");
	document.write("****************"+"<br>");
	x =new Point("a",true);
	document.write("x="+x.x+"<br>");
	document.write("y="+x.y+"<br>");
}catch(e){
	document.write("参数类型错误");
}执行结果:

x=2
y=3
****************
x=4
y=6
****************
x=10
y=0
****************
参数类型错误 

引用
注意:在使用了命名参数的函数中,arguments中的参数也始终是相应命名参数的别名,不管这个参数是值类型还是引用类型,改变arguments中的参数值一定会影响到对应的命名参数,反之亦然。

  相关解决方案