读书人

函数的参数跟Arguments对象

发布时间: 2012-10-29 10:03:53 作者: rapoo

函数的参数和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=2document.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=2document.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=2y=3****************x=4y=6****************x=10y=0****************参数类型错误 

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

读书人网 >Web前端

热点推荐