Flutter学习笔记1.5 Dart基础(函数 参数的多种定义方式 可选参数 默认参数 命名参数 箭头函数 匿名函数 递归 闭包)

122 阅读3分钟

自定义函数: 自定义函数的基本格式:

  返回类型  方法名称(参数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(); //调用方法
}

####函数 参数的定义方式 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、定义一个带可选参数的方法 ,最新的dart定义可选参数需要指定类型默认值

  String printUserInfo(String username,[int age=0]){  //行参
    if(age!=0){
      return "姓名:$username---年龄:$age";
    }
    return "姓名:$username---年龄保密";
  }
  print(printUserInfo('张三',21)); //实参
  print(printUserInfo('张三'));

4、定义一个带默认参数的方法

  String printUserInfo(String username,[String sex='男',int age=0]){  //行参
    if(age!=0){
      return "姓名:$username---性别:$sex--年龄:$age";
    }
    return "姓名:$username---性别:$sex--年龄保密";
  }
  print(printUserInfo('张三'));
  print(printUserInfo('小李','女'));
  print(printUserInfo('小李','女',30));

5、定义一个命名参数的方法,最新的dart定义命名参数需要指定类型默认值

  String printUserInfo(String username, {int age = 0, String sex = '男'}) {//行参
    if (age != 0) {
      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);

需求
1、定义一个方法isEvenNumber来判断一个数是否是偶数

  bool isEvenNumber(int n) {
    if (n % 2 == 0) {
      return true;
    }
    return false;
  }

2、定义一个方法打印1-n以内的所有偶数

  printNum(int n) {
    for (var i = 1; i <= n; i++) {
      if (isEvenNumber(i)) {
        print(i);
      }
    }
  }
  printNum(10);

####匿名函数

  var printNum=(){
    print(123);
  };
  printNum();

  var printNum=(int n){
    print(n+2);
  };
  printNum(12);

####自执行方函数

  ((int n){
    print(n);
    print('我是自执行方法');
  })(12);

####函数的递归

  var sum = 1;
  fn(int 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);

####闭包 闭包的写法: 函数嵌套函数,并return 里面的函数,这样就形成了闭包。 特性: 1.常驻内存
2.不污染全局
比较: 1、全局变量特点: 全局变量常驻内存、全局变量污染全局 2、局部变量的特点: 不常驻内存会被垃圾机制回收、不会污染全局

闭包: 函数嵌套函数, 内部函数会调用外部函数的变量或参数, 变量或参数不会被系统回收(不会释放内存) 产生了闭包,闭包可以解决这个问题。

/*全局变量*/
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();
}