淺談js中arguments對象

來源:互聯網
上載者:User

標籤:rip   數列   number   匿名函數   div   形參和實參   操作   決定   技術   

一、先來看看到底是個啥?

arguments對象在JS中應該算數比較特殊的對象。不能顯示的建立,只在當前函數調用的時候才可以使用,長得有點像數組,但絕對不是Array的執行個體。

 

幾點說明:

1.1、arguments實際上是當前函數的一個內建屬性,在當前函數內,函數名.arguments等價於arguments,在函數外單獨使用arguments是沒有意義的;

1.2、arguments對象的長度由實際參數個數決定。
1.3、函數中的形參和實參是可以相互影響的。

可以看出,當傳入的實參個數少於形參個數的時候,以實參為準。

實際上,函數的實參已經存入到arguments對象中了。

----------------------------------------------------------------------------------------------------------------

二、那我們可以怎麼使用這個arguments對象呢? 

2.1、檢查傳入的參數數量是否正確?

function func1(a,b,c){   if(arguments.length!=3){      trow new Error(‘參數數量不正確‘)   }   /*****dosomthing*******/}以此類推,我們還可以限制傳入參數的類型。

2.2 類比實現重載。

js不能像java一樣通過不同的參數類型或者個數來實現函數的重載,why??? 因為函數其實也是對象,函數名就是函數的標識,壓根就是一個變數,參數只是這個函數的屬性。靠定義參數數量不同去實現函數的重載是不行的。

函數在被調用的時候,js是通過函數名去找到對應的函數,然後根據函數定義時候的參數,和運算式參數列表按順序匹配,多餘的參數捨棄,不夠的用undefined補全,那麼既然函數在調用的時候回產生一個arguments對象,我們是不是就可以利用這一點類比函數的重載???

//根據參數類比function func2(arg1, agr2, arg3){    var sum;    if(arguments.length == 1){       sum = arg1+100;   }else{       sum =arg1+arg2+arg3;    }   return sum;}//根據參數的值//根據參數類型類比function func2(arg){    if(typeof arg1 ==‘number‘){       /**操作1**/   }else if(typeof arg1 ==‘string‘){         /**操作2**/    }}

-------------------------------------------------------------------------

三、最後arguments還有一個callee屬性,從上面列印的結果看,callee返回的是正在被執行的Function對象,也就是制定對象的本文。

那麼這麼一說,callee還是有長度的,實際上arguments.callee.length==形參長度。說了這麼多,那一般什麼時候使用呢???

3.1可以利用arguments.callee.length==形參長度來驗證形參個實參的個數是不是一致。

3.2利用callee是函數本身的引用,處理匿名函數遞迴問題。

//求1~100的和,只是一個例子。//1、假如我們使用一般的遞迴函式var sum = function(n){     if(1==n){       return 1;    }else{      return n+sum(n-1);    }}//現在使用calleevar sum = function (n) {    if (n <= 0)        return 1;    else        return n + arguments.callee(n - 1)}  

  

/

有啥區別?

前者包含了對sum自身的調用,var sum相當於一個全域變數,每次調用都相當於調用一個全域變數。後者並沒有這樣,而是利用了callee的這個屬性,說來說去還不是遞迴(小心如),_^^_。說實話,平時應該很少人這麼去寫吧。

 

淺談js中arguments對象

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.