一、函数定义

  1. int add(int num1, int num2) {
  2. return num1 + num2;
  3. }
  4. add(1, 2); // 3
  1. 函数名前的int表示返回值类型为int
  2. 接收两个int类型的参数

所有的函数都返回一个值。如果没有指定返回值,则默认把语句 return null; 作为函数的最后一个语句执行。

二、胖箭头语法

如果函数体只包括一条语句,可以使用胖箭头语法

上面的函数可以写为

  1. int add(int num1, int num2) => num1 + num2;

三、命名参数

使用花括号将参数括起来即可:

  1. int add({int num1, int num2}) => num1 + num2;

命名参数是可选的,静态检查时不会报错,运行时可能会报错:

  1. add(num1: 1, num2: 2); // 3
  2. add(num1: 1); // Error

四、可选命名参数

为了可以规避上面的错误,可以使用可选参数:

  1. int add({int num1 = 0, int num2 = 0}) => num1 + num2;
  2. add(num1: 1, num2: 2); // 3
  3. add(num1: 1); // 1
  4. add(); // 0

可选命名参数同样适用于 List 或 Map 这样的泛型参数:

  1. void doStuff(
  2. {
  3. List<int> list = const [1, 2, 3],
  4. Map<String, String> gifts = const {
  5. 'first': 'paper',
  6. 'second': 'cotton',
  7. 'third': 'leather'
  8. }
  9. }) {
  10. print('list: $list');
  11. print('gifts: $gifts');
  12. }

五、可选位置参数

如果不使用命名参数,使用位置参数又希望其可以选填,则使用中括号将其包裹

  1. int add(int num1, int num2, [int num3 = 0]) => num1 + num2 + num3;
  2. add(1,2,3); // 6
  3. add(1,2); // 3

六、一等方法对象

可以把方法当做参数调用另外一个方法。例如:

  1. printElement(element) {
  2. print(element);
  3. }
  4. var list = [1, 2, 3];
  5. list.forEach(printElement);

七、匿名方法

上面的调用方式等价于:

  1. list.forEach((item) { printElement(item); });

如果方法只包含一个语句,可以使用胖箭头语法缩写

  1. list.forEach((item) => printElement(item));

八、变量赋值

方法也可以赋值给一个变量:

  1. var printElement = (element) => print(element);

九、作用域

Dart 中 var 的作用域与 JS 中的 let 类似, 包括全局作用域、局部作用域、块级作用域

十、闭包

跟 JS 类似的闭包语法:

  1. Function makeAdder(num addBy) {
  2. return (num i) => addBy + i;
  3. }
  4. var add10 = makeAdder(10);
  5. print(add10(5)); // 15
  6. print(add10(3)); // 13