dart闭包

首先得明白下面2点:

  1. 全局变量的特点:常驻内存,污染全局变量
  2. 局部变量的特点:会被垃圾回收机制回收,不会污染作用域…
// 闭包.dart
void main(){
    myClosure(){
        var a = 0; // a是一个局部变量.函数执行完毕后将被清理
        return (){
            a++;
            print(a);
        };
    }
    var fn = myClosure();
    fn();
    fn();
    fn();
}
// 闭包.dart
void main(){
    myClosure(){
        var a = 0; // a是一个局部变量.函数执行完毕后将被清理
        return (){
            a++;
            print(a);
        };
    }
    var fn = myClosure();
    fn();
    fn();
    fn();
}

 

 

在这里插入图片描述
原因如下:

// 1.myClosure里面返回了一个匿名函数 () { a++; print(a);};
// 2.匿名函数可以访问到myClosure()函数内部的局部变量a;
// 3.函数的返回给了fn,即fn相当于匿名函数再内存中的一个地址.可以通过fn访问到内存中的这个匿名函数

 

结果:

// 很明显,内存中存储a的值的,那部分区域并未释放(否则,a的值不会从1到3变化)

如果不赋值给fn,直接运行myCloure()三次,效果:
void main(){
    myClosure(){
        var a = 0; // a是一个局部变量.函数执行完毕后将被清理
        return (){
            a++;
            print(a);
        };
    }
    myClosure()();
    myClosure()();
    myClosure()();
}

 

 这里面的逻辑和c++差十万八千里,还需要好好理解一下

 
posted @ 2020-08-09 16:52  NeoZy  阅读(265)  评论(0编辑  收藏  举报