一,匿名方法定义

(参数1,参数2,....){方法体...return 返回值}

二,匿名方法特性

  • 可赋值给变量,通过变量进行调用
  • 可在其他方法中直接调用或传递给其他方法

    void main(List<String> args) {
     //无参匿名函数
     var func = () {
       print("Hello");
      };
     func();

    //有参匿名函数
     var func1 = (str) {
       print("Hello-------$str");
     };
     func1("huangxiaoguo");

    //通过()进行调用,不推荐使用(自执行函数,匿名函数的一种)
      (() {
        print("通过()进行调用,不推荐使用");
      })();

    //匿名方法传参
      var list2 = ['h', 'e', 'l', 'l', 'o'];
      print(listTimes(list2, (str) {
        return str * 3;
      }));
    }

    List listTimes(List list, String times(str)) {
       for (var i = 0; i < list.length; i++) {
        list[i] = times(list[i]);
       }
       return list;
     }

    打印结果:

    Hello
    Hello-------huangxiaoguo
    通过()进行调用,不推荐使用
    [hhh, eee, lll, lll, ooo]
    Exited

三,什么是闭包?闭包的优缺点?

  • 1场景

    • 想实现的功能:

      • 1.常驻内存 
        2.不污染全局
    • 目前的功能: 
      • 1.全局变量特点: 全局变量常驻内存、全局变量污染全局
        2.局部变量的特点: 不常驻内存会被垃圾机制回收、不会污染全局
        3.闭包的特点:常驻内存、不污染全局
    • 闭包:

      • 概念:函数嵌套函数, 内部函数会调用外部函数的变量或参数, 变量或参数不会被系统回收(不会释放内存)

      • 写法:函数嵌套函数,并return 里面的函数,这样就形成了闭包。

  • 2、变量作用域

    要理解闭包,首先要理解Dart的特殊的变量作用域。

    变量的作用域无非就两种:全局变量和局部变量。

    Dart语言的特别之处就在于:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。

  • 3、如何从外部读取函数内部的局部变量?

    (1)出于种种原因,我们有时候需要获取到函数内部的局部变量。但是,上面已经说过了,正常情况下,这是办不到的!只有通过变通的方法才能实现。

    那就是在函数内部,再定义一个函数。

    a() {int count = 0;printCount() {print(count++);}return printCount;
    }b() {int count = 10;return () { print(--count); }; }

    (2)在上面的代码中,函数printCount就被包括在函数a内部,这时a内部的所有局部变量,对printCount都是可见的。但是反过来就不行,printCount内部的局部变量,对a就是不可见的。

    这就是Dart语言特有的"链式作用域"结构(chain scope),

    (3)子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

    既然printCount可以读取a中的局部变量,那么只要把printCount作为返回值,我们不就可以在a外部读取它的内部变量了吗!

    void main(List<String> args) {var func = a();for (var i = 0; i < 5; i++) {func();}print("-------------------------");var func1 = b();for (var i = 0; i < 5; i++) {func1();}
    }a() {int count = 0;printCount() {print(count++);}return printCount;
    }b() {int count = 10;return () {print(--count);};
    }

  • 4、闭包的概念

    上面代码中的a中的 printCount函数 和 b中匿名函数,就是闭包

    各种专业文献的闭包定义都非常抽象,我的理解是: 闭包就是能够读取其他函数内部变量的函数

    由于在Dart中,只有函数内部的子函数才能读取局部变量,所以说,闭包可以简单理解成“定义在一个函数内部的函数“。

    所以,在本质上,闭包是将函数内部和函数外部连接起来的桥梁

  •  5、闭包的用途

    闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会在a()b()调用后被自动清除。

    为什么会这样呢?原因就在于aprintCount的父函数,而printCount被赋给了一个全局变量,这导致printCount始终在内存中,而printCount的存在依赖于a,因此a也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。

  • 6、使用闭包的注意点

    (1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

    (2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

转载于:https://www.cnblogs.com/lxlx1798/p/11038986.html

【Dart学习】-- Dart之匿名方法闭包相关推荐

  1. C#学习笔记之匿名方法

    匿名方法(Anonymous methods) 提供了一种传递代码块作为委托参数的技术.匿名方法是没有名称只有主体的方法. 在匿名方法中您不需要指定返回类型,它是从方法主体内的 return 语句推断 ...

  2. Dart 学习笔记一(操作符、方法与异常)

    目录 Dart变量 final和const修饰符 Dart的内置类型 numbers Strings Booleans Lists(列表) Maps(映射集合) Runes(用于在字符串中表示Unic ...

  3. 【dart学习】-- Dart之函数

    1. 指定返回值得函数 /** * 无返回值的函数 * params: 可以是任意类型(var和Object类型也可以任意类型). 当然这里的参数类型你可以随意指定我这里已dynamic为例 * 参数 ...

  4. C#学习笔记(六):可空类型、匿名方法和迭代器

    可空类型 为啥要引入可空类型? 在数据库中,字段是可以为null值的,那么在C#中为了方便的操作数据库的值,微软引入了可空类型. 声明可空类型 我们可以使用两种方法声明一个可空类型: 1 Nullab ...

  5. Dart —— 函数 函数参数 匿名函数

    Dart汇总请点击这里 函数 文章目录 函数 可选参数 命名可选参数 位置可选参数 默认参数值 main() 函数 函数是一等对象 匿名函数 返回值 Dart 是一门真正面向对象的语言, 甚至其中的函 ...

  6. Flutter 学习 - Dart 语言基础

    文章目录 前言 一.Dart 概述 Dart 重要的概念 二.变量与基本数据类型 三.函数 四.运算符 五.流程控制语句 六.异常处理 七.面向对象 构造函数 继承类 抽象类 枚举类型 八.泛型 九. ...

  7. Dart 学习笔记-函数及运算符

    函数 Dart 是一门真正面向对象的语言, 甚至其中的函数也是对象 . 这也意味着函数可以被赋值给变量或者作为参数传递给其他函数. 也可以把 Dart 类的实例当做方法来调用. 以下是函数实现的示例: ...

  8. 匹夫细说C#:委托的简化语法,聊聊匿名方法和闭包

    0x00 前言 通过上一篇博客<匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的>的内容,我们实现了使用委托来构建我们自己的消息系统的过程.但是在日常的开发中,仍然有很多开发者因为 ...

  9. C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质

    前言 C# 3.0 引入了 Lambda 表达式,程序员们很快就开始习惯并爱上这种简洁并极具表达力的函数式编程特性. 本着知其然,还要知其所以然的学习态度,笔者不禁想到了几个问题. (1)匿名函数(匿 ...

  10. Dart学习笔记01:环境搭建与开发环境配置

    文章目录 一.Dart概述 二.下载Dart for Windows 三.安装Dart for Windows 四.命令行方式安装Dart (一)安装Chocolatey 1.启动PowerShell ...

最新文章

  1. Git之深入解析在没有合适的网络或者可共享仓库情况下的git bundle打包操作
  2. 大厂十年研发经历,总结了12条安卓开发条经验
  3. java time schedule_Java Timer schedule疑问
  4. photoshop实现图片更换背景
  5. 线性回归、bagging回归、随机森林回归
  6. ps蒙版怎么用:你会用ps蒙版吗?【萧蕊冰】
  7. iphone 操作手势种类
  8. 物联网视觉技术及应用
  9. 广联达登录显示服务器异常求回答,求助【服务器异常】
  10. ASP.NET限制上传文件类型
  11. primeng使用步骤
  12. Java做图片上传、文件上传、 批量上传、 Base64图片上传 。附上源码
  13. ENC28J60电路故障 网络灯不亮
  14. 如何用好 Google 等搜索引擎?
  15. selenium中的三种等待方式以及显示等待和隐式等待区别
  16. 线刷MTKAndroid手机
  17. 讯飞云论坛的网页设计demo
  18. 解决:android 开发 WIFI 功能 密码输入正确时监听的问题
  19. 【筛质数】——朴素筛,埃式筛,欧拉筛
  20. OTA升级详解(二)

热门文章

  1. PackageManagerService源码阅读笔记
  2. 【JAVA秒会技术之ActiveMQ】ActiveMQ的快速入门
  3. Poj(1182),种类并查集
  4. redis 性能监控和排查
  5. 回不去原来是没有 实现这个 代理方法,
  6. docker网络配置详解
  7. java 设置系统参数_Java 设置系统参数和运行参数
  8. 大碰撞!当Linux多线程遭遇Linux多进程
  9. X86-64和ARM64用户栈的结构 (1) ---背景介绍
  10. uboot驱动模型(DM)分析(二)