- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
1. 方法作为参数传递
方法在dart中也是一个对象,在dart中,万物皆对象,所以可以赋值给一个变量,并且变量可以执行函数。
var sum = sum1(1,2,3);
//执行函数
sum();
方法也可以作为参数传递。这里就会分别打印1,2,3,4。
var list = [1,2,3,4];
list.forEach(print);
forEach源码:
void forEach(void action(E element)) {
for (E element in this) action(element);
}
方法作为参数:
void functionDemo() {
sum2(sum1);
}
void sum2( func(int a,[int b , int c ])){
print(func(1,2,3));
}
sum1(int a,[int b = 0, int c = 0]){
return a + b + c;
}
2. 匿名函数
匿名函数就是没有方法名称的方法。
var func = () {
print('匿名方法');
};
// 调用
func();
还有一种匿名方法是立即执行函数。
(() {
print('立即执行函数');
})();
匿名方法也可以作为参数传递
sum2((int a,[int b = 0, int c = 0]){
return a + b + c;
});
3. 闭包
闭包(closure),定义在函数里面的函数就是闭包,闭包也是一个对象。闭包能够访问外部方法内的局部变量,并持有其状态(这是闭包最大的作用,可以通过闭包的方式,将其暴露出去,提供给外部访问)
funcA() {
int count = 0;
return ()=>print(count++);//这个匿名函数就是一个闭包。
}
这里闭包会一直持有count,count会一直存在不会被释放,运行后会依次打印0,1,2,3。这里func2是返回的一个新的对象,所以会重新开始依次打印0,1。
void closureDemo(){
var func = funcA();
func();
func();
func();
func();
var func2 = funcA();
func2();
func2();
}
funcA() {
int count = 0;
return ()=>print(count++);//这个匿名函数就是一个闭包。
}