Skip to content

函数

特性

  1. 拥有词法作用域,即大括号内定义的变量只能在大括号内访问
  2. 所有的函数都有返回值。没有显示返回语句的函数最后一行默认为执行 return null;
  3. 函数是一级对象,可以作为参数传递给另一个函数

定义

  1. 函数体
dart
bool isNumber(int num) {
	return num is int;
}
  1. 箭头函数,只用于函数体只包含一个表达式的时候
dart
bool isNumber(int num) => num is int;
  1. 匿名函数
dart
(int num) {
    return num is int;
}(1);

参数

有两种形式的参数:必要参数可选参数

  • 必要参数定义在参数列表前面,可选参数则定义在必要参数后面
  • 可选参数可以是 命名的位置的
  • 可以用 = 为函数的命名参数和位置参数定义默认值

向函数传入参数或者定义函数参数时,可以使用尾逗号

命名参数

  1. 使用 {参数1, 参数2, …} 来指定命名参数
dart
// 参数如果不是可选的,则必须给定默认值
String join({String? one, String two = 'two'}) {
    return `$one and $two`;
}
  1. 调用函数时,使用 参数名: 参数值 的形式来指定命名参数
dart
join(one: 'one') // one and two

虽然命名参数是可选参数的一种类型,但是仍然可以使用 required 来标识一个命名参数是必须的参数,此时调用者必须为该参数提供一个值

dart
const Scrollbar({Key? key, required Widget child})

位置参数

  1. 使用 [] 将一系列参数包裹起来作为位置参数
dart
String join(String one, [String? two, String three = 'three']) {
    return '$one and $two and $three';
}
  1. 使用
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);
}