闭包 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;
               }
           }

       }

这是修改后的最终结果,同时支持 多个数据计算,单个数据计算,数组计算,
这里写图片描述

此文只是个人学习使用,不足之处,请留言评论,谢谢!!!

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