Dart - 函数

110 阅读13分钟

Dart 知识点 - 函数

函数有两种形式的参数:

  • 必要参数:放在参数列表的前面

  • 可选参数:放在参数列表的后面,其又可以分为两种

    • 命名参数:使用花括号 {} 括起来的参数
    • 位置参数:使用方括号 [] 括起来的参数
// 命名参数
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.
}
复制代码

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

往期精彩推荐

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

分类:

iOS

标签:

iOSFlutter前端

文章被收录于专栏:

cover

flutter

Flutter 相关的文章

关注专栏

安装掘金浏览器插件

多内容聚合浏览、多引擎快捷搜索、多工具便捷提效、多模式随心畅享,你想要的,这里都有!

前往安装

评论

相关推荐

Canton @ Foreign Enterprise

获得点赞 8,019

文章被阅读 570,529

下载稀土掘金APP

一个帮助开发者成长的社区

相关文章

纯 CSS 实现十个还不错的 Loading 效果

101点赞

 

 · 

 

12评论

JavaScript 事件循环机制

66点赞

 

 · 

 

15评论

10个JS优化小技巧

250点赞

 

 · 

 

49评论

前端仔学学设计模式--单例模式

23点赞

 

 · 

 

6评论

10 个不错的 CSS 小技巧

794点赞

 

 · 

 

68评论

目录

下一篇


Flutter 开发出现的那些 Bugs 和解决方案「持续更新... 」

\