arguments

arguments關鍵字,只在函數內部起做用,且永遠指向當前函數的調用者傳入的全部參數,相似數組而不是數組數組

function foo(x){
   for(var i=0;i<arguments.length;i++){
       console.log(arguments[i]);
   }
}
foo(10);  //10
foo(10,-2,2);  //10  -2   2

利用arguments,你能夠得到調用者傳入的全部參數。也就是說,即便函數不定義任何參數,仍是能夠拿到參數的值函數

function A(){
    if(arguments.length ==0){
        return 0;
    }else{
        var x = arguments[0];
        return x >=0 ? x : -x;       
     }    
}
console.log(A());   //0     
console.log(A(10));    //10
console.log(A(-9,-7)); //9

實際上arguments最經常使用於判斷傳入參數的個數,因爲JavaScript函數容許接收任意個參數,咱們就不得不用arguments來獲取全部參數。spa

function B(a,b){
    var i,rest = [];
    if(arguments.length > 2){
        for(i = 2 ;i<arguments.length;i++){
            rest.push(arguments[i]);
        }
    }
    console.log('a = ' + a );
    console.log('b = ' + b );
    console.log(rest );
}
 B(1,2,3,4,5);
 /*
  a = 1
  b = 2
  [3,4,5]
*/ B(1); /* a
= 1 b = undefined [] */

ES6標準引入了rest參數,上面的函數能夠改寫爲指針

function D(a,b,...rest){
    console.log('a = ' + a );
    console.log('b = ' + b );
    console.log(rest );
}
D(1,2,3,4,5);        
/*
  a = 1
  b = 2
  [3,4,5]
 */
 D(1);
 /*
  a = 1
  b = undefined
  []
 */

 arguments是一個類數組對象,該對象還有一個callee屬性,還屬性是一個指針,指向擁有這個arguments對象的函數,rest

function a(num){
   if(num <= 1){
       return 1;
   }else{
      return num * a(num -1)
   }
}
var a2 = a;
a = function(){
    return 0;
}
console.log(a(5));   //0
console.log(a2(5));  //0
function b(num){
if(num <= 1){
     return 1;
}else{
     return num * arguments.callee(num -1)
} } var c
= b; b = function(){ return 0; }; console.log(c(5)); //120 console.log(b(5)); //0

在上面的遞歸函數a中,函數的執行與函數名牢牢耦合,一旦函數名改變,就須要及時更改函數內部,在函數b中,使用了arguments.callee,下降函數耦合性,這樣,不管引用函數時使用的是什麼名字,都能正常完成遞歸調用。code

相關文章
相關標籤/搜索