• Dart匿名方法函数和闭包


    /*
      内置方法/函数:
    
          print();
    
      自定义方法:
          自定义方法的基本格式:
    
          返回类型  方法名称(参数1,参数2,...){
            方法体
            return 返回值;
          }
    */
    
    void printInfo(){
      print('我是一个自定义方法');
    }
    
    int getNum(){
      var myNum=123;
      return myNum;
    }
    
    String printUserInfo(){
    
      return 'this is str';
    }
    
    
    List getList(){
    
      return ['111','2222','333'];
    }
    
    void main(){
    
      // print('调用系统内置的方法');
    
      // printInfo();
      // var n=getNum();
      // print(n);
    
    
      // print(printUserInfo());
    
    
      // print(getList());
    
      // print(getList());
      
    
    //演示方法的作用域
      void xxx(){
    
          aaa(){
    
              print(getList());
              print('aaa');
          }
          aaa();
      }
    
      // aaa();  错误写法 
    
      xxx();  //调用方法
    
    
    }
    //调用方法传参
    
    main() {
      
    
    //1、定义一个方法 求1到这个数的所有数的和      60    1+2+3+。。。+60
    
    
     /*
        int sumNum(int n){
          var sum=0;
          for(var i=1;i<=n;i++)
          {
            sum+=i;
          }
          return sum;
        } 
    
        var n1=sumNum(5);
        print(n1);
        var n2=sumNum(100);
        print(n2);
    
     */
           
    
    
    //2、定义一个方法然后打印用户信息
    
    
        // String printUserInfo(String username,int age){  //行参
        //     return "姓名:$username---年龄:$age";
        // }
    
        // print(printUserInfo('张三',20)); //实参
    
    
    
    
    
    //3、定义一个带可选参数的方法
        
    
        // String printUserInfo(String username,[int age]){  //行参
    
        //   if(age!=null){
        //     return "姓名:$username---年龄:$age";
        //   }
        //   return "姓名:$username---年龄保密";
    
        // }
    
        // // print(printUserInfo('张三',21)); //实参
    
        // print(printUserInfo('张三'));
       
    
    
    
    //4、定义一个带默认参数的方法
    
    
        // String printUserInfo(String username,[String sex='男',int age]){  //行参
    
        //   if(age!=null){
        //     return "姓名:$username---性别:$sex--年龄:$age";
        //   }
        //   return "姓名:$username---性别:$sex--年龄保密";
    
        // }
    
      // print(printUserInfo('张三'));
    
      // print(printUserInfo('小李','女'));
    
      //  print(printUserInfo('小李','女',30));
    
    
    
    //5、定义一个命名参数的方法
    
      // String printUserInfo(String username,{int age,String sex='男'}){  //行参
    
      //     if(age!=null){
      //       return "姓名:$username---性别:$sex--年龄:$age";
      //     }
      //     return "姓名:$username---性别:$sex--年龄保密";
    
      // }
    
      // print(printUserInfo('张三',age:20,sex:'未知'));
    
    
    
    //6、实现一个 把方法当做参数的方法
    
    
      // var fn=(){
    
      //   print('我是一个匿名方法');
      // };      
      // fn();
    
    
    
    
      //方法
      fn1(){
        print('fn1');
      }
    
      //方法
      fn2(fn){
        
        fn();
      }
    
      //调用fn2这个方法 把fn1这个方法当做参数传入
      fn2(fn1);
    }
    void main(){
    
    /*需求:使用forEach打印下面List里面的数据*/
    
        // List list=['苹果','香蕉','西瓜'];
        // list.forEach((value){
        //   print(value);
        // });
        // list.forEach((value)=>print(value));
        // list.forEach((value)=>{
        //   print(value)
        // });
    
    /*需求:修改下面List里面的数据,让数组中大于2的值乘以2*/
    
        List list=[4,1,2,3,4];
    
        // var newList=list.map((value){
    
        //     if(value>2){
        //       return value*2;
        //     }
        //     return value;
    
        // });
        // print(newList.toList());
    
    
      //  var newList=list.map((value)=>value>2?value*2:value);
    
      //  print(newList.toList());
    
    
    
    /*
    需求:    1、定义一个方法isEvenNumber来判断一个数是否是偶数  
             2、定义一个方法打印1-n以内的所有偶数
    */
    
    
    //定义一个方法isEvenNumber来判断一个数是否是偶数  
        bool isEvenNumber(int n){
          if(n%2==0){
            return true;
          }
          return false;
        }
    
        printNum(int n){
            for(var i=1;i<=n;i++){
                if(isEvenNumber(i)){
                  print(i);
                }
            }
        }
    
        printNum(10);
    
    
    }
    int getNum(int n){
    
      return n;
    }
    
    
    
    void main(){
    
        
      // print(getNum(12));
    
    
    
      //匿名方法
    
      // var printNum=(){
    
      //   print(123);
      // };
    
      // printNum();
    
    
    
      // var printNum=(int n){
    
      //   print(n+2);
      // };
    
      // printNum(12);
    
    
    
    
    //自执行方法
    
    
        // ((int n){
        //   print(n);
        //   print('我是自执行方法');
        // })(12);
    
    
    
    
    
    
    
    
    //方法的递归
          // var sum=1;            
          // fn(n){
          //     sum*=n;
          //     if(n==1){
          //       return ;
          //     }         
          //     fn(n-1);
              
          // }
    
          // fn(5);      
          // print(sum);
    
    
    
    //通过方法的递归 求1-100的和
    
        var sum=0;
        fn(int n){
    
            sum+=n;
    
            if(n==0){
              return;
            }
            fn(n-1);
        }
    
        fn(100);
        print(sum);
    
    
     
    }
    /*
    闭包:
    
        1、全局变量特点:    全局变量常驻内存、全局变量污染全局
        2、局部变量的特点:  不常驻内存会被垃圾机制回收、不会污染全局  
    
    
      /*  想实现的功能:
    
            1.常驻内存        
            2.不污染全局   
    
              产生了闭包,闭包可以解决这个问题.....  
    
              闭包: 函数嵌套函数, 内部函数会调用外部函数的变量或参数, 变量或参数不会被系统回收(不会释放内存)
      
                闭包的写法: 函数嵌套函数,并return 里面的函数,这样就形成了闭包。
    
        */  
    */
    /*全局变量*/
    var a=123;
    
    void main(){
    
        // print(a);
    
        // fn(){
        //   a++;
        //   print(a);
        // }
        // fn();
        // fn();
        // fn();
    
    //局部变量
        // printInfo(){
        //   var myNum=123;
        //   myNum++;
        //   print(myNum);
        // }
        // printInfo();
    
        // printInfo();
        // printInfo();
    
    //闭包
    
              fn(){
            var a=123;  /*不会污染全局   常驻内存*/
            return(){            
              a++;            
              print(a);
            };        
          }     
          var b=fn();    
          b();
          b();
          b();
    }

     

  • 相关阅读:
    【问题记录】IIS配置项
    Dapr可观测性
    es6 set方法使用
    js 数据类型
    获取到select下的所有option的文字和值
    使用js的webrtc进行sip协议连接,实现webrtc与电话网打通
    Qt (QGis) 中动态布局例子
    Latex中使注脚首行不缩进,且新行与首行对齐
    [转] 控制域的更新方式_小强office
    访问被屏蔽的FTP网站
  • 原文地址:https://www.cnblogs.com/loaderman/p/11026629.html
Copyright © 2020-2023  润新知