首先,arguments是JavaScript里的一个内置对象,说arguments像个数组,是因为它和NodeList类似,都拥有length属性,也可以写成类似数组的样式arguements[参数索引值] 来代表传给函数的参数,但它没有push和pop等数组方法,因此它不能算是数组,它只是Arguments对象的一个实例。其次,arguments只有在function体内才有意义。
arguments.length 表示实参长度。 JS不会主动为你判断你到底给函数传了多少个参数,如果你传多了,多余的部分就不会被使用;如果你传少了,那么没接收到实参值的形参的值就是undefined。这时,我们可以借助arguments的length属性来检测调用函数时是否使用了正确数目的实际参数。此外,引用一个形式参数可以用参数名,也可以用arguments[ i ]数组形式,其中arguments[ i ]表示第i 个参数。
arguments还为我们提供了这样一种可能,就是为一个函数传递任意数目的实际参数:
比如说,我想判断你传给我的一些数字的大小,并取出最大的那个,对,你传多少参数都行,只要是数字(因为传的是数字函数内部就不用我再判断类型了,呵呵)。如下:
JavaScript代码: |
<script language="JavaScript" type= "text/javascript"> function max( ) var n=max( 8,79,86,-34,-751,64,-854 ); //参数可以是任意多个 alert ( n ); </script> |
如何?此法甚妙吧?呵呵。
个人探究:
在网上搜一下关于arguements的讲解内容,你会找到很多令你头晕的解释(或许它本身就很难解释清楚),比如下面【】之间这几段:
【在javascript中arguments对象是函数的实际参数,arguments与形式参数的值是一致的。比如,函数change(param)的形参叫param,并且只有这一个参数,那么param与arguments[0]都是对这个参数值的引用,改变其中任何一个的值,即改变了二者所有的值。
演示如下:
function change(param)
{
alert(param); //比如我给param传的值为smallpig的值,那么alert就是smallpig的值,如果啥也没传就会alert undefined。
arguments[0] = 'xiaoxiaozi' ; //我用arguments[0]改变了这个参数的值
alert(param); //没错,param值变成了xiaoxiaozi
}
change(smallpig); 】
先卖个关子哈,看完上面【】之间的解释后,我想问你,arguements到底起了个什么作用?它是如何产生的,又是如何周旋于实参和形参之间而当"第三者"的?它到底是形参的引用还是实参的引用?这之间有什么猫腻儿?
……
…
说啥也没用,让代码说话最管用!下面来个弹出轰炸:

①在smallpig的值为初始值"ceshi"而还未改成"hehe"之前,实参的第一个(即smallpig)、变量smallpig本身、形参(即param)、argument[0]的值都将是"ceshi"。
②在函数体内将smallpig的值改为"hehe"之后,实参的第一个:smallpig( 此处的smallpig在函数体外部,不受内部定义的smallpig影响 )的值仍是"ceshi" ;变量smallpig在不用var重定义前是"ceshi",定义后变成"hehe";形参( 即param )仍为"ceshi";arguments[0~2]也保持不变。
③将arguments[0]的值改为"xiaoxiaozi"之后,实参的第一个:smallpig肯定也不变,变量smallpig保持②中原态,形参param值变为arguments[0]的值"xiaoxiaozi"。
④将形参param的值改为"fuck"后,arguments[0]的值也变成"fuck"。
综合上述结果,可得:arguements对象是函数调用时创建的隐含对象,它相当于实参的一个克隆(拷贝或说复制品),但不是实参的引用,它与形参是对应关系,是形参的引用,比如,arguments[0]是第1个形参的一个引用,arguments[1]是第2个形参的一个引用……arguments[ i ]是第i+1个形参的一个引用。如果传值过程中有多个实参,而只有一个形参,那么arguments[0]是这个形参的引用,而arguments[i>0]则保持原实参传过来的值不变,可在需要时用arguments[i]调用。
通俗地说,函数调用时实参把值传给arguments[i]后就不管了,让arguments[i]和形参两人随便鼓捣去,哪怕你实参把原先传给arguments[i]的原始值又偷着改掉了,那也没用了,arguments[i]和形参继续玩,无视实参。