代码改变世界

Arguments

2012-04-12 18:10  呦菜  阅读(368)  评论(0编辑  收藏  举报

Arguments对象

属性:

  callee     对当前正在执行的函数的引用

  length    传递给函数的参数个数,同时也是Arguments对象中的数组元素个数

 

Arguments对象是一个类似数组的对象,注意是类似数组哦,从技术上来讲它不是数组,但是具有带编号的属性,这些属性可以作为数组元素,而且它有length属性。当一个函数被调用时,会为该函数创建一个Arguments对象。

arguments[]数组只在函数体内定义。在函数体内,arguments应用该函数的Arguments对象。


Arguments对象容许完全的存取那些实际参数值,即使某些参数还没有被命名。什么意思呢?看下面的代码就知道了

function foo(a,b,c,d)
{

    alert(arguments.length);  //5
    alert(arguments[4]);     //tt

}

foo(1,1,1,"s","tt");

 

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

看下面代码:

 

function foo(a,b,c,d)
{
    arguments[3] = "sss";  
    alert(arguments[3]);   //sss
    alert(d);              //sss
    d = "m";
    alert(arguments[3]);   //m
}

foo(1,1,1,"s","tt");

 

 

使用Argument对象可以编写函数使之能够使用任意数目的实际参数,以简单的max()函数作为例子,返回最大的参数值:

function max()
{
    var m = Number.NEGATIVE_INFINITY;
    for(var i= 0; i < arguments.length; i++)
    {
        if(arguments[i] > m)
        {
            m = arguments[i];
        }
    }
    return m;
}

var largest = max(1,2000,3,100,9);
alert(largest); //2000

 

callee属性用来应用当前正在执行的函数,它可以用来允许对未命名的函数递归的调用自身。如下:

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

var y = factorial(5);
alert(y);  // 120