携手创作,共同成长!这是我参与「日新计划 8 月更文挑战」的第5天,点击检查活动概况

Dart 是一种真正面向目标的言语,所以即便函数也是目标而且类型为Function,这意味着函数能够被赋值给变量或许作为其它函数的参数。

引荐运用线上编辑器 dartpad.cn 进行学习,测试

参数

函数有两种方式的参数:

  • 必要参数:放在参数列表的前面
  • 可选参数:放在参数列表的后边,其又能够分为两种
    • 命名参数:运用花括号 {} 括起来的参数
    • 方位参数:运用方括号 [] 括起来的参数
// 命名参数
void main() {
  // sayHi(); // 报错,由于第一个参数是必要参数
  sayHi(' Jimmy '); // Hello Jimmy nullnull
  sayHi(' Jimmy ', name2: 'and Timmy.'); // Hello Jimmy and Timmy.null
}
void sayHi(String name1, { String? name2, String? name3 }) {
  print('Hello' + name1 + name2.toString() + name3.toString());
}

注意:如果一个参数是可选的,可是不能为 null,你需要为它供给一个默认值

咱们更改一下上面的代码:

void main() {
  sayHi(' Jimmy '); // Hello Jimmy ,Timmy and Kimmy.
}
void sayHi(String name1, { String name2 = ',Timmy ', String name3 = 'and Kimmy.' }) {
  print('Hello' + name1 + name2 + name3);
}

上面的命名参数是运用 key: value 的方式调用的,而下面要讲的方位参数,是在指定的方位,填写 value 值即可,改写上面的代码如下:

void main() {
  sayHi(' Jimmy ', ' and Kimmy.', ''); // Hello Jimmy  and Kimmy.
}
void sayHi(String name1, [String name2 = ',Timmy ', String name3 = 'and Kimmy.']) {
  print('Hello' + name1 + name2 + name3);
}

ps:命名参数和方位参数,其调用的方式不同

main 函数

每个 Dart程序都必须有一个,main 函数程序的进口。Flutter 应用程序也是从 main 函数发动的。

void main() => runApp(MyApp());
// MyApp 是一个类

函数能够作为参数传递

函数是一级目标,能够将函数作为参数传递给另一个函数。比方:

void sayHi(String name) {
  print(name);
}
var list = ['Jimmy', 'Timmy', 'Kimmy'];
list.forEach(sayHi);
// Jimmy
// Timmy
// Kimmy

匿名函数

匿名函数顾名思义,即便没有函数名称。咱们能够创立一个没有姓名的办法,称之为匿名函数Lambda 表达式Closure 闭包

完整的语法格局如下:

([[类型] 参数[, ...]]) {
  函数体
}

比方:

var list = ['Jimmy', 'Timmy', 'Kimmy'];
list.forEach((String item) {
  print(item);
});
// Jimmy
// Timmy
// Kimmy

词法效果域

Dart 是词法效果域言语,意味着变量的效果域是静态确定的。变量的效果域在写代码的时候就确定了,大括号内界说的变量只能在大括号内访问。比方:

String outMain = 'out main';
void main() {
  String insideMain = 'inside main';
  sayHi();
  print(outMain); // out main
  print(name); // 报错
}
void sayHi() {
  String name = 'Jimmy';
  print(outMain); // out main
//   print(insideMain); // 报错
  print(name); // Jimmy
}

词法闭包

闭包便是一个函数目标,即便函数目标的调用在它原始效果域之外,依然能够访问它词法效果域内的变量。比方:

// 闭包便是一个函数目标
Function sayHi(String prefix) {
  return (String name) => prefix + name;
}
void main() {
  var sayHi1 = sayHi('Hello ');
  var sayHi2 = sayHi('Hi ');
  print(sayHi1); // Closure 'sayHi_closure'
  print(sayHi2); // Closure 'sayHi_closure'
  print(sayHi1('Jimmy.')); // Hello Jimmy.
  print(sayHi2('Jimmy.')); // Hi Jimmy.
}

关于闭包,后边会专门出一篇文章讲解,敬请期待…

往期精彩引荐

  • Dart 知识点 – 数据类型
  • Dart 知识点 – 运算符

如果读者觉得文章还能够,不防一键三连:关注➕点赞➕收藏