JavaScript函数中的arguments对象

        ECMAScript标准中,每一个函数都有一个特殊的内置对象arguments。arguments对象是一个类Array对象(object),用以保存函数接收到的实参副本。 javascript

1、内置特性 java

       说它是一个内置对象是由于咱们在建立函数时并无定义这个对象: 数组

var funcTest =function(args){
   console.log(arguments);            
}
funcTest('a');  //{'a'}
console.log(funcTest.arguments);

       直接调用funcTest.arguments输出的结果是null,这一点更能够说明arguments的内置性,当函数开始执行时才能调用到该对象。 函数

2、arguments保存的是函数的实参副本 spa

        在声明一个函数时,函数内部会开辟内存空间用以存储形式参数的变量(指针),这一过程是在定义函数时完成的;而arguments是依据传入的实参而开辟内存空间用以存储实参副本,这一过程是在调用函数时发生的。二者并无在同一内存空间中存储变量的值。 prototype

        1,当实参数量等于形参数量时,二者中的值是同步的: 指针

function funcTest(a,b){
    alert(a);            //1
    alert(arguments[0]); //1
    a='11';
    alert(a);            //11
    alert(arguments[0]); //11
    arguments[0]='22';
    alert(a)             //22
}
funcTest('1','2');

        2,有时它们的值并不一样步: code

function funcTest(a,b,c){
   alert(arguments[0]);  //1
   alert(c);             //undefined
   c='3';
   alert(arguments[2]);  //undefined
}
funcTest('1','2');

       arguments对象根据传入的实参顺序来与实参的值进行同步,若是该顺序(index)中没有传入实参则不一样步。 对象

       3,仅仅是保存实参的副本: 递归

function funcTest(a,b){
   alert(arguments[2])   //undefined
   arguments[2]="1";
   alert(arguments[2]);  //undefined   
}
funcTest('1','2');

       在使用arguments对象时, 在函数内部并不能经过使用arguments[n]的形式来开辟新的内存空间用以保存变量的值,也不能经过该方法增长arguments中的变量数。arguments在函数被调用后即开辟内存空间,该空间数目依据实参数量而来,不可更改。

3、arguments的属性

       1,length属性

       arguments.length返回对象中存储的变量的长度

       2,callee 方法

       arguments.callee返回函数自身的引用

var funcTest=function(){
    alert(funcTest===arguments.callee);   //true
}

      arguments.callee指向函数自身的引用,这在使用匿名函数时会比较有用。

      咱们能够利用arguments.callee来建立一个递归函数:

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

      也能够用来判断参数数目:

function funcTest(a,b){
    if(arguments.length!=arguments.callee.length){
        alert('传入的参数数目不足!');
    }
}

4、将arguments对象转换成数组(Array)

       开篇语里提到arguments对象是一个类数组对象,是由于它有一些特性和数组很类似,好比有length的属性和相似数组的索引器访问内部变量的特性。但实际上它并非一个真正的数组。咱们能够经过下面的方式将它转换成一个真正的数组:

      var  arr=Array.prototype.slice.call(arguments);

相关文章
相关标签/搜索