閉包 arguments 屬性的使用(閉包)

仔細看了下,稍微簡化了下最終代碼
寫出一個text函數,並實現以下效果
text(1,2); 輸出 3
text(1)(2); 輸出 3
text(1,2)(3); 輸出 6
text(1,2)(3,4);輸出 10

聲明一個text函數,先對arguments參數的數量進行判斷,然後再返回出一個函數,返回函數裏再對arguments參數的數量進行判斷進行返回輸出

調用text() 只支持單個參數

function text(){
    //false 默認值是0,true 默認數字值是 1,如果不給num賦值的話 無法計算,始終輸出 NaN
           var num=false;
           if(arguments.length<=1){
               num+=arguments[0];
               return function(){
                   if(arguments.length<=1){
                       return num+arguments[0];
                   }else{
                       for(var i=0;i<arguments.length;i++){
                           num+=arguments[i];
                       }
                       return num;
                   }
               }
           }else{
               for(var i=0;i<arguments.length;i++){
                   num+=arguments[i];
               }
               return num;
           }

       }

這裏寫圖片描述

下面對它進行一些改進,讓它支持多個參數。其實就只是在text函數的else裏面加了一個返回函數

function text(){
           var num=false;
           if(arguments.length<=1){
               num+=arguments[0];
               return function(){
                   if(arguments.length<=1){
                       return num+arguments[0];
                   }else{
                       for(var i=0;i<arguments.length;i++){
                           num+=arguments[i];
                       }
                       return num;
                   }
               }
           }else{
               for(var i=0;i<arguments.length;i++){
                   num+=arguments[i];
               }
               return function(){
                   if(arguments.length==0)return num;
                   for(var i=0;i<arguments.length;i++){
                           num+=arguments[i];
                   }
                   return num;
               }
           }

       }

這裏寫圖片描述

也許這樣你會覺得一次傳入多個參數,不是很笨重嗎,我直接傳個數組不就好了。有道理,咱們再對它進行下改進

function text(){
           var num=false;
           for(var i=0;i<arguments.length;i++){
               if((typeof arguments[i])!='number' && (typeof arguments[i])!='object'){
                   throw '參數不正確,請檢查傳入參數是否爲number或array';
               }
           }
           if(arguments.length<=1){
               if((typeof arguments[0])=='number'){
                   num+=arguments[0];
                   return function(){
                       for(var i=0;i<arguments.length;i++){
                           if((typeof arguments[i])!='number' && (typeof arguments[i])!='object'){
                               throw '參數不正確,請檢查傳入參數是否爲number或array';
                           }
                       }
                       if(arguments.length<=1){
                           if((typeof arguments[0])=='number'){
                               return num+arguments[0];
                           }else{
                               for(var i=0;i<arguments[0].length;i++){
                                   num+=arguments[0][i];
                               }
                               return num;
                           }

                       }else{
                           for(var i=0;i<arguments.length;i++){
                               num+=arguments[i];
                           }
                           return num;
                       }
                   }
               }else{
                   for(var i=0;i<arguments[0].length;i++){
                       num+=arguments[0][i];
                   }
                   return function(){
                       for(var i=0;i<arguments.length;i++){
                           if((typeof arguments[i])!='number' && (typeof arguments[i])!='object'){
                               throw '參數不正確,請檢查傳入參數是否爲number或array';
                           }
                       }
                       if(arguments.length<=1){
                           if((typeof arguments[0])=='number'){
                               return num+arguments[0];
                           }else{
                               for(var i=0;i<arguments[0].length;i++){
                                   num+=arguments[0][i];
                               }
                               return num;
                           }

                       }else{
                           for(var i=0;i<arguments.length;i++){
                               num+=arguments[i];
                           }
                           return num;
                       }
                   }
               }

           }else{
               for(var i=0;i<arguments.length;i++){
                   num+=arguments[i];
               }
               return function(){
                   if(arguments.length==0)return num;
                   for(var i=0;i<arguments.length;i++){
                       if((typeof arguments[i])!='number' && (typeof arguments[i])!='object'){
                           throw '參數不正確,請檢查傳入參數是否爲number或array';
                       }
                   }
                   for(var i=0;i<arguments.length;i++){
                       num+=arguments[i];
                   }
                   return num;
               }
           }

       }

這是修改後的最終結果,同時支持 多個數據計算,單個數據計算,數組計算,
這裏寫圖片描述

此文只是個人學習使用,不足之處,請留言評論,謝謝!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章