Skip to content

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"
}