Dart 函数
定义与使用
dart
返回值类型 函数名() {
// ...
}
void main() {
函数名();
}
函数返回值
无返回值
dart
void 函数名() {
// ...
}
void main() {
函数名();
}
一个返回值
dart
返回值类型 函数名() {
return 返回值;
}
void main() {
返回值类型 返回值 = 函数名();
}
多个返回值
dart
(返回值1类型 返回值1, 返回值2类型 返回值2) 函数名() {
return (返回值1, 返回值2);
}
void main() {
print(函数名()); // (返回值1, 返回值2)
}
函数参数
固定参数
dart
返回值类型 函数名(形参1类型 形参1, 形参2类型 形参2) {
// ...
}
void main() {
函数名(实参1, 实参2);
}
可选参数
可以通过一个列表形式定义可能会接收的可选参数
可选参数必须定义在所有明确定义的形参之后
dart
返回值类型 函数名([形参1类型? 形参1, 形参2类型? 形参2]) {
if(参数1 != null){
// ...
}
if(参数2 != null){
// ...
}
}
返回值类型 函数名(形参1类型? 形参1, [形参2类型? 形参2, 形参3类型? 形参3]) {
// ...
}
具名参数
dart
返回值类型 函数名({形参1类型? 形参1, required 形参2类型 形参2}) {
// ...
}
void main() {
函数名(形参1: 值, 形参2: 值);
函数名(形参2: 值, 形参1: 值);
函数名(形参2: 值);
}
参数默认值
dart
返回值类型 函数名(形参1类型 形参1 = 默认值, 形参2类型 形参2 = 默认值) {
// ...
}
void main() {
函数名(实参1, 实参2);
}
回调函数
函数的参数可以接收一个匿名函数,改匿名函数被称为回调函数
当回调函数的函数体很简单尤其是只有一行时,建议使用箭头函数
dart
typedef 回调函数类型 = 返回值类型 Function(形参1类型 形参1, 形参2类型 形参2);
返回值类型 函数名(回调函数类型 回调函数) {
回调函数(实参1, 实参2);
}
void main() {
函数名((形参1, 形参2){
// ...
});
}
特殊函数
入口函数
Dart 中的所有逻辑都要在入口函数main
中执行
dart
void main() {
// ...
}
匿名函数
dart
Function 函数变量 = () {
// ...
}
Function 函数变量 = (形参1类型 形参1, 形参2类型 形参2) {
// ...
}
Function 函数变量 = ({形参1类型? 形参1, required 形参2类型 形参2}) {
// ...
}
箭头函数
Dart 箭头函数只能写为一行,常用于定义简单的不需要重用的逻辑
dart
Function 箭头函数 = () => 单行语句;
Function 箭头函数 = (形参1类型 形参1, 形参2类型 形参2) => 单行语句;
Function 箭头函数 = ({形参1类型? 形参1, required 形参2类型 形参2}) => 单行语句;
立即执行函数
dart
// 无参数时
((){
// ...
})()
// 有参数时
((形参1类型 形参1, 形参2类型 形参2){
// ...
})(实参1, 实参2)
常用操作
递归
递归是指函数在自己内部调用自己
为了避免出现无限递归导致的内存泄露,执行递归时必须要有一个判断条件
dart
返回值类型 函数名() {
if (条件) {
函数名();
}
}
例子:利用递归实现斐波那契数列
dart
int fibo(int num) {
if (num == 1 || num == 2) {
return 1;
}
return fibo(num - 1) + fibo(num - 2);
}
void main() {
print(fibo(1)); // 1
print(fibo(2)); // 1
print(fibo(3)); // 2
print(fibo(4)); // 3
print(fibo(5)); // 5
print(fibo(6)); // 8
print(fibo(7)); // 13
}
闭包
闭包是指函数内将一个函数作为返回值返回,被返回的函数即闭包函数
闭包常用于抛出函数内私有变量避免全局污染、创建工厂函数等
dart
返回值类型 函数名() {
var 变量 = 值;
return () {
// ...
};
}
void main() {
const 闭包函数 = 函数();
闭包函数();
}
不要滥用闭包
闭包的变量会一直保存在内存中,尤其是在循环、频繁执行的逻辑中会导致内存泄漏和性能下降
例子:通过闭包实现在函数外访问函数作用域中变量
dart
String Function() getPerson() {
String person = 'Andy';
return () {
return person;
};
}
void main() {
String person = getPerson()();
print(person); // "Andy"
}