dart闭包
首先得明白下面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++差十万八千里,还需要好好理解一下
进击的小🐴农