Arguments对象

来源:互联网 发布:积分商城 php源代码 编辑:程序博客网 时间:2024/06/04 19:42

在一个函数体内,标识符arguments具有特殊含义。它是引用Arguments对象的一个特殊属性。

Arguments对象是一个类似数组的对象点击打开链接,可以按照数目而不是名字获取传递给函数的参数值。Arguments对象也定义了callee属性,我们会讨论这个属性。

尽管定义JavaScript函数时有固定数目的命名参数,但当调用这个函数时,传递给它的参数数目却可以是任意的。Arguments对象允许完全地存取那些实际参数值,即使某些或全部参数还没有被命名。假定定义了一个函数f,要传递给它一个实参x。如果用两个实参来调用这个函数,那么在函数体内,用形参x或arguments[0]可以存取第一个实参,而第二个实参只能通过arguments[1]来存取。而且和真正的数组一样,arguments具有length属性,用于说明它所含有的元素个数。因此,在函数f的主体内,如果调用时使用的是两个实参,那么arguments.length的值就是2。

① arguments对象可以用于多个方面。下面的例子说明了如何使用它来验证调用函数时是否使用了正确数目的实参,因为JavaScript自身不会做这项检测。

<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"><script>function f(x,y,z){if(arguments.length!=3){alert("arguments error !");}return(x+y+z);}</script></head><body><a href="javascript:f(1,2);void 0;">函数参数不对时调用函数</a><br><a href="javascript:f(1,2,3);">正确地调用函数</a></body></html>
② arguments对象还为JavaScript函数开发了一项重要的可能性,即可以编写函数使之能够使用任意数目的实参。下面的例子说明了如何编写一个简单的getMax( )函数,让它能够接受任意数目的实参,然后返回其中最大的参数的值。

<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"><script>function getMax(){var m=Number.NEGATIVE_INFINITY;for(var i=0;i<arguments.length;i++){if(arguments[i]>m) m=arguments[i];}return m;}</script></head><body><a href="javascript:getMax(1,2,3,4,5,100);">调用函数getMax</a></body></html>
像这样的能够接收任意数目的参数的函数叫做可变参数函数

记住arguments并非真正的数组,它是一个Arguments对象。虽然每个Arguments对象都定义了带编码的数组元素和length属性,但是它不是数组,将它看作偶然具有了一些带编码的属性的对象更合适一些。ECMAScript标准没有要求Arguments对象实现数组的所有特殊行为。例如可以给arguments.length属性赋值,但是ECMAScript并不要求这样做来改变对象中定义的数组元素数。

③ Arguments对象还有一个非同寻常的特性。

当函数具有命名了的参数时,Arguments对象的数组元素是存放函数参数的局部变量的同义词。arguments[ ]数组和命名了的参数不过是引用同一变量的两种不同方法。相反,用参数名改变一个参数的值同时会改变通过arguments[ ]数组获得的值。通过arguments[ ]数组改变参数的值同样会改变用参数名获取的参数值。例如:

<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"><script>function f(x){alert(x);arguments[0]=null;alert(x);}</script></head><body><a href="javascript:f(5);">调用函数f(5)</a></body></html>
如果Arguments对象是一个普通的数组,这肯定不是所能见到的行为。在这个例子中,arguments[0]和x最初都引用相同的值。

最后记住arguments只是一个普通的javascript标识符,而不是保留字。如果函数有一个参数或者局部变量使用了这个名字,它就会隐藏对Arguments对象的引用。因此,把arguments当作一个保留字并且避免将其用作变量名,是个不错的办法。

④ 属性callee,可以用来允许对未命名的函数递归地调用自身。

除了数组元素,Arguments对象还定义了callee属性,用来引用当前正在执行的函数。这个属性没什么太大用处,但它可以用来允许对未命名的函数递归地调用自身。下面是一个未命名的函数直接量,用于计算阶乘:

function(x){if(x<=1) return 1;return x*arguments.callee(x-1);}



原创粉丝点击