主题
函数
特性
- 拥有词法作用域,即大括号内定义的变量只能在大括号内访问
- 所有的函数都有返回值。没有显示返回语句的函数最后一行默认为执行
return null;
- 函数是一级对象,可以作为参数传递给另一个函数
定义
- 函数体
dart
bool isNumber(int num) {
return num is int;
}
- 箭头函数,只用于函数体只包含一个表达式的时候
dart
bool isNumber(int num) => num is int;
- 匿名函数
dart
(int num) {
return num is int;
}(1);
参数
有两种形式的参数:必要参数 和 可选参数
- 必要参数定义在参数列表前面,可选参数则定义在必要参数后面
- 可选参数可以是 命名的 或 位置的
- 可以用
=
为函数的命名参数和位置参数定义默认值
向函数传入参数或者定义函数参数时,可以使用尾逗号
命名参数
- 使用
{参数1, 参数2, …}
来指定命名参数
dart
// 参数如果不是可选的,则必须给定默认值
String join({String? one, String two = 'two'}) {
return `$one and $two`;
}
- 调用函数时,使用
参数名: 参数值
的形式来指定命名参数
dart
join(one: 'one') // one and two
虽然命名参数是可选参数的一种类型,但是仍然可以使用
required
来标识一个命名参数是必须的参数,此时调用者必须为该参数提供一个值dartconst Scrollbar({Key? key, required Widget child})
位置参数
- 使用
[]
将一系列参数包裹起来作为位置参数
dart
String join(String one, [String? two, String three = 'three']) {
return '$one and $two and $three';
}
- 使用
dart
join('one', 'two'); // one and two and three
闭包
闭包 即一个函数对象,即使函数对象的调用在它原始作用域之外,依然能够访问在它词法作用域内的变量。
函数可以封闭定义到它作用域内的变量。接下来的示例中,函数 makeAdder()
捕获了变量 addBy
。无论函数在什么时候返回,它都可以使用捕获的 addBy
变量。
dart
Function makeAdder(int addBy) {
return (int i) => addBy + i;
}
void main() {
// Create a function that adds 2.
var add2 = makeAdder(2);
// Create a function that adds 4.
var add4 = makeAdder(4);
assert(add2(3) == 5);
assert(add4(3) == 7);
}