# 函数

# 函数定义

自定义方法:

返回类型 方法名(参数1,参数2,...){
    方法体;
    return 返回值;//与返回类型保持一致
}

比如main方法:

void main(){
  print('Hello Dart.');
}

我们一般自定义一个方法,可在main中调用:

void printMsg(String msg){
  print('自定义方法 $msg');
}
main(){
  printMsg('Hello Dart.');
}

//自定义方法 Hello Dart.

# 可选参数

可选参数使用中括号[]括起来,放在参数列表末尾,可以是多个,例如:

void printUsrInfo(String name,[int age]){
  if(age!=null)
  print('姓名: $name,年龄:$age');
  else
  print('姓名: $name,年龄:未知');
}
main(){
  printUsrInfo('张三',23);
  printUsrInfo('李四');
}

//姓名: 张三,年龄:23
//姓名: 李四,年龄:未知

# 默认参数

同可选参数一样,默认参数也写在中括号中,并且写在可选参数前,赋有默认值,则此参数如果不传,默认使用该默认值。

void printUsrInfo(String name,[String sex = '男',int age]){
  if(age!=null)
  print('姓名: $name,年龄:$age,性别:$sex');
  else
  print('姓名: $name,年龄:未知,性别:$sex');
}
main(){
  printUsrInfo('张三','男',23);
  printUsrInfo('李四','女');
}

//姓名: 张三,年龄:23,性别:男
//姓名: 李四,年龄:未知,性别:女

# 命名参数

命名参数用大括號{},调用传参时使用类似于键值对传入,如:

void printUsrInfo(String name,{String sex = '男',int age}){
  if(age!=null)
  print('姓名: $name,年龄:$age,性别:$sex');
  else
  print('姓名: $name,年龄:未知,性别:$sex');
}
main(){
  printUsrInfo2('张三',age:20,sex:'未知');
}

//姓名: 张三,年龄:20,性别:未知

把方法当做参数

var fn = () {
  print('我是一个匿名方法');
};
//方法
fn1() {
  print('fn1');
}

//方法
fn2(fn) {
  fn();//这里的 fn 是参数 fn,不是上面的函数 fn
}

main() {
  //调用fn2这个方法 把fn1这个方法当做参数传入
  fn2(fn1);//fn1
}

# 箭头函数

箭头函数函数体只能一行代码。

  List list = ['Apple', 'HuaWei', 'Samsung'];
  //遍历
  list.forEach((value) {
    print(value);
  });
  //箭头函数
  list.forEach((value)=>{
    print(value)
  });
  list.forEach((value)=>print(value));

map函数,一数组,单数乘2,偶数不变。

  List list2 = [1, 2, 3, 4, 5, 6, 7];
  var newList = list2.map((value) {
    if (value % 2 == 1) {
      return value * 2;
    }
    return value;
  });
  print(newList.toList());
  //[2, 2, 6, 4, 10, 6, 14]

  //箭头函数改写
  var newList2 = list2.map((value) => value % 2 == 1 ? value * 2 : value);
  print(newList2.toList());

# 匿名函数

  var printNum = (int num){
    print(num);
  };
  printNum(123+32);

# 自执行方法

已运行自动执行。

((){
  print('自执行方法');
})();

# 闭包函数

  1. 全局变量 常驻内存,污染全局
  2. 局部变量 不常驻内存,会被垃圾回收机制回收,不会污染全局

闭包:函数嵌套函数,内部函数会调用外部函数的变量的参数,变量会参数不会被系统回收

闭包写法:函数嵌套函数,并return里面函数,形成闭包。

  fun() {
    var a = 1;
    return () {
      a++;
      print(a);
    };
  }

  var b = fun();
  b();b();b();
  //2
  //3
  //4