喜迎
春节

函数说明


Dart函数是代码的构建块,用于执行特定的任务,并返回值,将代码逻辑划分为独立的功能模块,提高可读性和可维护性。

1 函数

  • 函数即方法,内置的方法,例如:print()
  • 自定义方法,格式:返回类型 方法名称(参数1, 参数2, ..., 参数n) { }
// 全局作用域
void printInfo() {
  print('全局作用域');
  printGlobal() {
    print('局部作用域');
  }

  // 局部作用域只在局部调用
  printGlobal();
}

void main() {
  print('内置方法');
  // 调用方法
  printInfo();

  // 全局作用域
  int getNum() {
    var myNum = 12345678;
    return myNum;
  }

  // 调用方法
  var n = getNum();
  print(n);
}

2 参数

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

  var n = sumNum(20);
  print(n);

  // 定义一个方法,然后打印用户信息
  // 方法传参:形参
  String printUserInfo(String username, int age) {
    return '姓名:$username --- 年龄:$age';
  }

  // 方法传参:实参
  print(printUserInfo('张三', 21));
}

2-1 可选参数

main() {
  // 定义一个方法,该方法带可选参数:[Data type Variable]
  String printUserInfo(String username, [int age = 0]) {
    if(age != null) {
      return '姓名:$username --- 年龄:$age';
    }
    return '姓名:$username --- 年龄:保密';
  }

  // 方法传参:实参
  print(printUserInfo('张三', 21));
}

2-2 默认参数

main() {
  // 定义一个方法,该方法带默认参数:[Data type Variable = 'Default']
  String printUserInfo(String username, [int age = 21]) {
    if(age != null) {
      return '姓名:$username --- 年龄:$age';
    }
    return '姓名:$username --- 年龄:保密';
  }

  // 方法传参:实参
  print(printUserInfo('张三'));
  print(printUserInfo('李四', 22));
}

2-3 命名参数

main() {
  // 定义一个方法,该方法带命名参数:{Data type Variable = 'Default'}
  String printUserInfo(String username, {int age = 0}) {
    if(age != null) {
      return '姓名:$username --- 年龄:$age';
    }
    return '姓名:$username --- 年龄:保密';
  }

  // 方法传参:实参
  print(printUserInfo('张三', age: 21));

  // 实现一个方法,该方法将另一个方法当作参数传入
  fn1() {
    print('将fn1作为一个参数传入fn2');
  }

  fn2(fName) {
    fName();
  }

  fn2(fn1);
}

3 箭头函数

main() {
  // 箭头函数:forEach打印List里的数据
  List list = ['樱桃', '香蕉', '苹果'];
  list.forEach((element) => print(element));
  list.forEach((element) => {print(element)});

  // 修改List里的数据,让数组中大于2的值乘以2
  List listNum = [4, 1, 2, 3, 4];
  var newList = listNum.map((e) {
    if(e > 2) {
      return e * 2;
    }
    return e;
  });
  print(newList.toList());

  var newListNum = listNum.map((e) => e > 2 ? e * 2 : e);
  print(newListNum.toList());
}

4 相互调用

main() {
  // 定义一个方法,使用isEvenNumber判断一个数是否为偶数
  bool isEvenNumber(int n) {
    if(n % 2 == 0) {
      return true;
    }
    return false;
  }

  // 定义一个方法,打印1-n以内的所有偶数
  printNum(int n) {
    for(var i=1; i<=n; i++) {
      if(isEvenNumber(i)) {
        print(i);
      }
    }
  }

  // 函数的相互调用
  printNum(9);
}

5 匿名函数

main() {
  // 匿名函数
  var printNumber = (){
    print(123);
  };
  printNumber();
}

6 方法递归

main() {
  // 方法递归:条件满足的情况下在方法内调用自身,求1-100的和
  var sum = 0;
  fn(int n) {
    sum += n;
    if(n == 1) {
      return;
    }
    fn(n - 1);
  }
  
  fn(100);
  print(sum);
}

7 闭包操作

  • 全局变量特点:常驻内存,污染全局。
  • 局部变量特点:不常驻内存,支持垃圾机制回收,不污染全局。
  • 要想实现常驻内存,又不会污染全局,闭包可以解决这些问题。
    • 写法:函数嵌套函数,并return里面的函数,这样就形成了闭包。
    • 说明:内部函数调用外部函数的变量或参数,且这些变量或参数不会被系统回收。
main() {
  // 闭包
  fn() {
    var a = 123;
    return() {
      a++;
      print(a);
    };
  }

  var b = fn();
  b();
  b();
  b();
}

8 自执行方法

main() {
  // 自执行方法:即不需要调用,自动执行的方法
  (() {
    print('自执行方法一');
  })();

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

文章作者: bsf
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 bsf !
评 论
  目录