# 11.函数

# 1.方法的定义 变量 方法的作用域

/**
 * 内置方法/函数
 *    print()
 * 
 * 自定义方法:
 *    自定义方法的基本格式:
 *      
 *    返回类型  方法名称 (参数1, 参数2,...) {
 *        方法体
 *        return 返回值;
 *  }
 */

void printInfo() {
  print('我是一个自定义方法');
}

int getNum() {
  var myNum=123;
  return myNum;
}

void main() {
  printInfo();
  print(getNum());

  // 演示方法的作用域
  void xxx() {
    aaa() {
      print('aaa');
    }
    aaa();
  }

  xxx();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

# 2.方法传参, 默认参数, 可选参数

  • 命名参数和可选参数不能同时存在

# 1).方法传参

  // 定义一个方法,求1到这个数的所有数的和
  int sumNum(int n) {
    var sum=0;
    for(var i = 1; i<=n;i++) {
      sum+=i;
    }
    return sum;
  }

  print(sumNum(60));
1
2
3
4
5
6
7
8
9
10

# 2).可选参数

  String printUser(String username, [int age]) {
    if(age != null) {
      return "姓名: $username--- 年龄:$age";
    }
    return "姓名: $username";
  }

  print(printUser('星城'));  // 姓名: 星城
1
2
3
4
5
6
7
8

# 3).默认参数

  String printUsers(String username, [String sex='男', int age]) {
    if(age != null) {
      return "姓名: $username -- 性别:$sex -- 年龄:$age";
    }
    return "姓名: $username -- 性别:$sex";
  }

  print(printUsers('星城','保密'));  // 姓名: 星城 -- 性别:保密
1
2
3
4
5
6
7
8

# 4).命名参数

    String printUserFunc(String username, {int age,String sex="男"}) {
    if(age != null) {
      return "姓名: $username -- 性别:$sex -- 年龄:$age";
    }
    return "姓名: $username -- 性别:$sex";
  }

  print(printUserFunc('星城',age:20));  // 姓名: 星城 -- 性别:男 -- 年龄:20
1
2
3
4
5
6
7
8

# 5).实现一个 把方法当作参数的方法

  // 方法
  fn1() {
    print('fn1');
  }

  // 方法
  fn2(fn) {
    fn();
  }

  // 调用fn2这个方法, 把fn1这个方法当做参数传入
  fn2(fn1);
1
2
3
4
5
6
7
8
9
10
11
12

# 3.箭头函数, 函数的相互调用

# 1).箭头函数

  List list = ['苹果', '香蕉', '西瓜'];

  list.forEach((value) => print(value));
1
2
3

# 2).函数的相互调用

  /**
   * 需求:  1.定义一个方法isEvenNumber来判断一个数是否是偶数
   *        2.定义一个方法打印1-n以内的所有偶数
   */

  // 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); // 2 4 6 8 10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 4.匿名方法,自执行方法, 方法的传递

# 1).匿名方法

  // 匿名方法
  var printNum = () {
    print(123);
  };

  printNum();
1
2
3
4
5
6

# 2).自执行方法

  // 自执行方法
  (
    () {
      print('我是自执行方法');
    }
  )();
1
2
3
4
5
6

# 3).方法的传递

  // 通过方法的递归, 求1-100的和
  var number=0;
  fnnc(int n) {
    number+=n;
    if(n==0) {
      return;
    }
    fnnc(n-1);
  }
  
  fnnc(100);
  print(number);
1
2
3
4
5
6
7
8
9
10
11
12

# 5.闭包

/**
 * 闭包
 *      1.全局变量特点:  全局变量常驻内存, 全局变量污染全局
 *      2.局部变量的特点: 不常驻内存会被垃圾机制回收, 不会污染全局
 * 
 * 想实现的功能:
 *      1.常驻内存
 *      2.不污染全局
 *      
 *         产生了闭包, 闭包可以解决这个问题.......
 *         
 *         闭包: 函数嵌套函数, 内部函数会调用外部函数的变量或参数, 变量或参数不*     会被回收
 * 
 *         闭包的写法:  函数嵌套函数, 并return 里面的函数, 这样就形成了闭包
 */

void main() {
  fn() {
    var a = 123; /* 不会污染全局  常驻内存*/
    return () {
      a++;
      print(a);
    };
  }

  var b = fn();
  b();    // 124
  b();    // 125
  b();    // 126
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
上次更新: 2021/2/21 下午7:52:17