js arguments 函數參數

在javascript函數體內,標識符arguments具備特殊含義。它是調用對象的一個特殊屬性,用來引用Arguments對象。Arugments對象就像數組,注意這裏只是像並非哈。javascript

javascript函數體內,arguments像數組(並非真的數組,是一個Arguments對象,再次強調)同樣,有length屬性,能夠表明傳給函數的參數的個數。java

引用一個形式參數能夠用參數名,也能夠用arguments[]數組形式,其中arguments[0]表示第一個參數。數組

因此,javascript中Arguments對象是函數的實際參數,下面,咱們一塊兒來進入這神奇的國度,一窺究竟。

arguments.length屬性:函數

js不會主動爲你判斷你到底給函數傳了多少個參數,若是你多傳了,多餘的部分就沒有被使用,若是你少傳了,那麼沒傳的參數值就是undefinedspa

因此咱們能夠藉助arguments的length屬性來檢測調用函數時是否使用了正確數目的實際參數,由於javascript是不會爲你作這些事的日誌

functionf(x,y,z)
{
  //首先檢查傳遞的參數數量是否正確
  if(arguments.length!=3)
   {
      thrownewError("function f called with"+arguments.length+"arguments ,but itnot 3 arguments.");
   }
   //下面運行真正的函數
}對象

arguments還爲咱們提供了這樣一種可能,就是爲一個函數傳任意數目的實際參數:遞歸

好比說,我想判斷你傳給個人一些數字的大小,取出最大的那個,對,沒錯,你傳多少參數都行,可是前提是你要傳數字,由於我在函數內部懶得判斷了。呵。ip

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];
   }
   returnm;
}it

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

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

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

改變其中一個值,即改變了兩者全部的值

functionchange(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;
   returnx*arguments.callee(x-1);
};

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

相關文章
相關標籤/搜索