Flutter —— dart基础语法(3)

192 阅读1分钟

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++);//这个匿名函数就是一个闭包。
}

在这里插入图片描述