100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > js函数传参——参数与arguments对象

js函数传参——参数与arguments对象

时间:2020-02-15 13:33:56

相关推荐

js函数传参——参数与arguments对象

arguments

函数接收参数,实际上是接收到一个数组

ECMAScript函数即使定义的函数只接收2个参数,在调用此函数时也不是必须要传2个参数才行,可以传一个、多个甚至是不传。之所以会这样是因为ECMAScript中的参数在内部是用一个数组来表示的;

函数接收到的始终是这个数组,而不关心数组中包含了哪些参数。

用arguments访问参数数组

在函数的体内可以通过arguments这个对象来访问这个参数数组,来获取传递给数组的每一个参数。

arguments与数组类似(但不是arr的实例)因为和数组一样可以使用“ [ ] ” 来访问每一个元素(如第一个元素arguments[0]),也可以用length确定传进来的参数个数。

例如:一个函数

function say(name,message){alert('Hello'+name+','+message);}

可以像下面这样重写:(也就是不显示的使用命名参数),这个重写的函数中不包含命名的参数,功能和上面是一样的。

也就是说ECMAScript函数的一个重要特点:在ECMAScript中解析器不会验证命名参数,命名参数只提供便利,但不是必须。

function say(name,message){alert('Hello'+arguments[0]+','+arguments[1]);}

用arguments对象的length属性可以知道有多少个参数传递给函数

例如:

function say(){alert(arguments.length);howManyArgs("string",45);//2howManyArgs();//0howManyArgs(45);//1}

执行上面这段代码会弹出3个信息框分别显示2 0 1。利用这一点可以实现函数接收任意参数分别来实现对应的功能。例如:

function add(){if(arguments.length==1){alert(arguments[0]+10);//只有一个参数时给这个参数+10}else if(arguments.length==2){alert(arguments[0]+arguments[1]);//有两个参数时,将两个参数相加并返回结果}}//调用add(10)//20add(30,20)//50

arguments对象可以与命名参数一起使用

例如:(arguments[0]的值与num1的值相同,arguments[1]的值与num2的值相同)

function doAdd(num1,num2){if(arguments.length==1){alert(num1+10);}else if(arguments.length==2){alert(arguments[0]+num2);}}

arguments的值永远与对应命名参数的值保持同步

如下函数:每次执行这个函数都会将第二个参数的值改为10,因为arguments中的值与对应命名参数的值保持同步,因此,修改了arguments[1],也就修改了num2,最后它们的值都会变为10

1.值得注意的是 虽然值会同步,但并不是意味着读取这两个值会访问相同的内存空间;它们的内存空间是独立的,只是值会同步。
2.另外,如果只传了一个参数,那么arguments[1]的值不会反映到命名参数中,因为arguments对象的长度是由传入参数的个数决定的,而不是由定义函数时命名参数的个数决定的。
3.另外,没有传递值的命名参数会被赋予undefined值,类似与定义了一个变量但是没有初始化(例如下面函数如果只传了一个参数,num2则为undefined)

function doAdd(num1,num2){arguments[1]=10alert(arguments[0]+num2);}

严格模式对arguments对象做了一些限制。

1.像doAdd()函数这样赋值会不生效,也就是说,即使把arguments[1]变为了10,num2的值仍然是undefined,并且重写arguments的值会导致语法错误(代码不会执行)。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。