一、内置方法

print…

二、自定义方法

2.1 函数的定义

小驼峰命名规则 方法的返回值不知道可不写;知道的话建议进行约束。而不是依靠推断。

  1. void printInfo() {
  2. print('自定义无返回值函数');
  3. }
  4. int getAge(int age) {
  5. return age;
  6. }
  7. void main() {}

2.2 可选参数 & 默认参数

[…] 可选 可选内部赋值代表是默认参数,必传参数不能赋默认值; 默认参数一般在最后…

  1. String getAge(String name, [int? age, String? sex='男']) {
  2. return age!=null ? '$name - $age - $sex' : '$name - $sex';
  3. }

2.3 命名(具名)参数

  1. String getAge(String name, {int? age, String? sex='男'}) {
  2. return age!=null ? '$name - $age - $sex' : '$name - $sex';
  3. }
  4. // 调用时指定名称 `名称:value`
  5. getAge('hao', age:18);

2.4 箭头参数

使用条件:函数体只有一句话

  1. list.forEach((element){
  2. print(element);
  3. });
  4. list.forEach((element) => print(element));

2.5 匿名函数

直接用var声明报警告: 无法推断函数literal的类型,因为该literal的主体是块。 尝试向变量添加显式类型。

  1. Function fn = () {
  2. print('匿名函数赋值给一个变量');
  3. };

2.6 自执行方法

不支持一元运算符

  1. // 不包裹函数体
  2. (){
  3. print('我是自执行方法!');
  4. }();
  5. // 包裹函数体
  6. ((){
  7. print('我是自执行方法!');
  8. })();

2.7 递归

自己调用自己;但必须给定退出条件

  1. var sum = 1;
  2. fn(int n) {
  3. sum *= n;
  4. if(n == 1) {
  5. return;
  6. }
  7. fn(n - 1);
  8. }
  9. fn(5); // 计算5的阶乘
  10. print(sum);

2.7 闭包

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

闭包:常驻内存且不会污染全局

  1. 区分全局和局部的概念

    1. var a = 1;
    2. void main(List<String> args) {
    3. void fn() {
    4. var b = 2;
    5. a++;
    6. b++;
    7. print('$a - $b');
    8. }
    9. fn();// 2 - 3
    10. fn();// 3 - 3
    11. }
  2. 闭包

    1. Function bibao() {
    2. var c = 123;
    3. return () {
    4. c++;
    5. print(c);
    6. };
    7. }
    8. var d = bibao();
    9. d();// 124
    10. d();// 125
    11. d();// 126