一、函数定义
int add(int num1, int num2) {
return num1 + num2;
}
add(1, 2); // 3
- 函数名前的int表示返回值类型为int
- 接收两个int类型的参数
所有的函数都返回一个值。如果没有指定返回值,则默认把语句 return null;
作为函数的最后一个语句执行。
二、胖箭头语法
如果函数体只包括一条语句,可以使用胖箭头语法
上面的函数可以写为
int add(int num1, int num2) => num1 + num2;
三、命名参数
使用花括号将参数括起来即可:
int add({int num1, int num2}) => num1 + num2;
命名参数是可选的,静态检查时不会报错,运行时可能会报错:
add(num1: 1, num2: 2); // 3
add(num1: 1); // Error
四、可选命名参数
为了可以规避上面的错误,可以使用可选参数:
int add({int num1 = 0, int num2 = 0}) => num1 + num2;
add(num1: 1, num2: 2); // 3
add(num1: 1); // 1
add(); // 0
可选命名参数同样适用于 List 或 Map 这样的泛型参数:
void doStuff(
{
List<int> list = const [1, 2, 3],
Map<String, String> gifts = const {
'first': 'paper',
'second': 'cotton',
'third': 'leather'
}
}) {
print('list: $list');
print('gifts: $gifts');
}
五、可选位置参数
如果不使用命名参数,使用位置参数又希望其可以选填,则使用中括号将其包裹
int add(int num1, int num2, [int num3 = 0]) => num1 + num2 + num3;
add(1,2,3); // 6
add(1,2); // 3
六、一等方法对象
可以把方法当做参数调用另外一个方法。例如:
printElement(element) {
print(element);
}
var list = [1, 2, 3];
list.forEach(printElement);
七、匿名方法
上面的调用方式等价于:
list.forEach((item) { printElement(item); });
如果方法只包含一个语句,可以使用胖箭头语法缩写
list.forEach((item) => printElement(item));
八、变量赋值
方法也可以赋值给一个变量:
var printElement = (element) => print(element);
九、作用域
Dart 中 var 的作用域与 JS 中的 let 类似, 包括全局作用域、局部作用域、块级作用域
十、闭包
跟 JS 类似的闭包语法:
Function makeAdder(num addBy) {
return (num i) => addBy + i;
}
var add10 = makeAdder(10);
print(add10(5)); // 15
print(add10(3)); // 13