引用:http://www.cnblogs.com/lwbqqyumidi/archive/2012/12/03/2799833.html
http://www.cnblogs.com/Fskjb/archive/2011/10/27/2227111.html
arguments对象的长度是由实参个数而不是形参个数决定的。形参是函数内部重新开辟内存空间存储的变量,但是其与arguments对象内存空间并不重叠。对于arguments和值都存在的情况下,两者值是同步的,但是针对其中一个无值的情况下,对于此无值的情形值不会得以同步。如下代码可以得以验证。
<script> function f(a, b, c) { alert("a:" + a) // result: "1" alert("b:" + b) // result: "2" alert("c:" + c) // result: "undefined" alert("arg:" + arguments[0]); // result: "1" alert("arg:" + arguments[1]); // result: "2" alert("arg:" + arguments[2]); // result: "undefined" alert("length:"+arguments.length); // result: "2" /*我修改a之后,arguments[0]跟着也变了*/ a = 100; alert("arg:"+arguments[0]); // result: "100" alert("a"+a) // result: "100" /*我修改arguments[0]之后,a的值也跟着变了*/ arguments[0] = "qqyumidi"; alert("a:"+a); // result: "qqyumidi" /*但是修改c的值,argments[2]却没有改变*/ alert(c); // result: "undefined" c = 2012; alert("c:"+c) // result: "2012" alert(arguments[2]); // result: "undefined" } f(1, 2); </script>
arguments对象中有一个非常有用的属性:callee。arguments.callee返回此arguments对象所在的当前函数引用。在使用函数递归调用时推荐使用arguments.callee代替函数名本身。
如下:
<script> function count(a) { if (a == 1) { return 1; } //alert(arguments.callee); //如果把上面的注释去掉,那么alert出来的就是如下的注释内容 //function count(a) { // if (a == 1) { // return 1; // } // alert(arguments.callee); // return a + arguments.callee(--a); //} return a + arguments.callee(--a); } var mm = count(10); alert(mm); //result: 55 </script>
有件事情我们需要注意下,在定义函数的时候,无论我们规定了参数的个数是几个。Javascript允许我们传递任何数量的参数到一个函数里,不管怎么定义这个函数。Arguments对象对这些都是允许的。比如下面,我们定义的参数个数是3个,但是我们传了5个也是可以的。
<script> function f(a, b, c) { alert("arg:" + arguments[0]); //result:1 alert("arg:" + arguments[1]); //result:2 alert("arg:" + arguments[2]); //result:3 alert("arg:" + arguments[3]); //result:4 alert("arg:" + arguments[4]); //result:5 } f(1, 2,3,4,5); </script>