js:argument

引用: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>
原文地址:https://www.cnblogs.com/mrxiaohe/p/5120539.html