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);

相關文章
相關標籤/搜索