Flutter - Dart基础(匿名函数、闭包)

801 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

匿名函数

函数表达式创建的函数叫做匿名函数,通常也说没有名字的函数叫做匿名函数

匿名函数的定义方式:

(参数列表){
    函数体
    return 返回值
}
//普通函数
show(param1, param2) {
    print("$param1 $param2");
}
show("hello", "world");

//匿名函数
var show1 = (param1, param2) {
    print("$param1 $param2");
};
show1("hello", "world");

匿名函数多被用于参数进行传递

  • 示例一

    定义一个函数 show,要求传入一个函数

    void show(Function fun) {
        fun();
    }
    

    函数调用

    void main(List<String> args) {
        var test = () => {print("函数作为参数")};
        show(test);
        
        // 也可以简写为:
        show(() => {
            print("函数作为参数")
        });
    }
    

    在实际开发中,匿名函数作为参数进行传递,往往不会按照示例一中 show 函数的方式定义。在示例一中,只是说明了参数是 Function 类型,但并没有明确说明这个 Function 类型的函数是否有参数、是否有返回值,所以,示例一的定义方式不推荐

  • 示例二

    定义一个函数 show,要求传入一个函数。该函数有返回值和参数,返回值是 String 类型,函数名称是 fun,函数参数是 name

    void show(String fun(String name)) {
        var result = fun("dart");
        print(result);
    }
    

    函数调用

    void main(List<String> args) {
    
        var test = (String name) {
            return name;
        };
        show(test);
        
        // 也可以简写为:
        // 使用箭头函数,=> name 是 {return name} 的简写
        show((name) => name);
    }
    

    在示例二中,虽然明确了函数 show 的参数格式,但是代码量大,不方便阅读

  • 示例三

    定义一个函数 show,要求传入一个函数。使用关键字 typedef 给传入的参数定义一个别名,别名为 ShowName,这样写会提高代码的阅读性

    typedef ShowName = String Function(String name);
    
    void show(ShowName showName) {
        var result = showName("dart");
        print(result);
    }
    

    函数调用

    void main(List<String> args) {
    
        var test = (String name) {
            return name;
        };
        show(test);
        
        // 也可以简写为:
        // 使用箭头函数,=> name 是 {return name} 的简写
        show((name) => name);
    }
    

闭包

  • 闭包是一个方法(对象)
  • 闭包定义在其他方法内部
  • 闭包能够访问外部方法内的局部变量,并持有其状态(这是闭包最大的作用,可以通过闭包的方式,将其暴露出去,提供给外部访问)
main() {
  //获取闭包
  var add = makeAdder(2);
  //执行闭包
  var value = add(3);
  print(value); // 5
}

Function makeAdder(num addBy) {
  // 内部声明一个函数 : 闭包
  sum(num i) {
    // 内部可以访问外部方法内的局部变量 addBy
    return i + addBy;
  }

  // 返回闭包
  return sum;
}