js arguments物件說明

jiestyle21發表於2011-10-29

在javascript函式體內,識別符號arguments具有特殊含義。它是呼叫物件的一個特殊屬性,用來引用Arguments物件。 Arugments物件就像陣列,注意這裡只是像並不是哈。

javascript函式體內,arguments像陣列(並不是真的陣列,是一個Arguments物件, 再次強調)一樣,有length屬性,可以代表傳給函式的引數的個數。

引用一個形式引數可以用引數名,也可以用arguments[]陣列形式,其中arguments[0]表示第一個引數。

所以,javascript中Arguments物件是函式的實際引數,下面,我們一起來進入這神奇的國度,一窺究竟。

arguments.length屬性:

js不會主動為你判斷你到底給函式傳了多少個引數,如果你多傳了,多餘的部分就沒有被使用,如果你少傳了,那麼沒傳的引數值就是undefined

所以我們可以藉助arguments的length屬性來檢測呼叫函式時是否使用了正確數目的實際引數,因為javascript是不會為你做這些 事的

function f(x,y,z)
{
   //首先檢查傳遞的引數數量是否正確
   if(arguments.length!=3)
   {
       thrownew Error("function f called with "+ arguments.length+"arguments ,but it not 3 arguments.");
   }
   //下面執行真正的函式
}

arguments還為我們提供了這樣一種可能,就是為一個函式傳任意數目的實際引數:

比如說,我想判斷你傳給我的一些數字的大小,取出最大的那個,對,沒錯,你傳多少引數都行,但是前提是你要傳數字,因為我在函式內部懶得判斷了。 呵。

function max()
{
   //根據我上一篇日誌,這已經是JavaScript內最小的數字了
   var m = Number.NEGATIVE_INFINITY;
   for(var i =0; i < arguments.length; i++)
   {
       //只要有任何一個引數比m大,那麼m就變成了這個引數的值
       if(arguments[i]> m)
            m = arguments[i];
   }
   return m;
}

怎麼樣?這個方法很巧妙吧?呵呵。

說明一下arguments與真正傳的形式引數是一致的:

比如,你給函式傳了一個叫param的引數,並且只有這一個引數,那麼param與arguments[0]都是對這個引數值的引用,

改變其中一個值,即改變了二者所有的值

function change(param)
{
   //比如我傳的param為simaopig,那麼alert就是simaopig,
   //如果啥也沒傳就會alert undefined
   alert(param);
   //用arguments[0]改變了這個引數的值
    arguments[0]='xiaoxiaozi';
   //沒錯,這個值變成了xiaoxiaozi
   alert(param);
}

arguments的callee屬性:

arguments的callee屬性是用來引用當前正在執行的函式,這對未命名的函式呼叫自身非常有好處。

現在用arguments的這個callee同樣可以簡單的實現

//用函式直接量,採用arguments.callee屬性實現遞迴函式
var result =function(x){
   if(x<=1)return1;
   return x*arguments.callee(x-1);
};

在最後提醒大家一點,既然這個arguments這麼厲害,那麼我們就不要為變數命名為arguments 了,事實上arguments是javascript的保留字之一。嗯。

相關文章