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
,你需要为它提供一个默认值
。
我们更改一下上面的代码:
代码语言:javascript复制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 是一个类
复制代码
函数可以作为参数传递
函数是一级对象,可以将函数作为参数传递给另一个函数。比如:
代码语言:javascript复制void sayHi(String name) {
print(name);
}
var list = ['Jimmy', 'Timmy', 'Kimmy'];
list.forEach(sayHi);
// Jimmy
// Timmy
// Kimmy
复制代码
匿名函数
匿名函数顾名思义,即使没有函数名称。我们可以创建一个没有名字的方法,称之为匿名函数、 Lambda 表达式 或 Closure 闭包。
完整的语法格式如下:
代码语言:javascript复制([[类型] 参数[, ...]]) {
函数体
}
复制代码
比如:
代码语言:javascript复制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
}
复制代码
词法闭包
闭包就是一个函数对象,即使函数对象的调用在它原始作用域之外,依然能够访问它词法作用域内的变量。比如:
代码语言:javascript复制// 闭包就是一个函数对象
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.
}
复制代码
关于闭包,后面会专门出一篇文章讲解,敬请期待...