函数

在Dart中,函数可以通过以下语法定义:

返回类型 函数名(参数列表) {
  // 函数体
}
int add(int a, int b) {
  return a + b;
}

可选参数

函数中可以包含零个或多个可选参数,可选参数分为命名参数和位置参数两种类型:

  • 命名参数:使用大括号{}包裹,并在调用时指定参数的名称;

  • 位置参数:使用方括号[]包裹,并且在调用时按照参数的位置传递值;

也可以为可选参数设置默认值,这样在调用时可以不提供这些参数的值,而是使用默认值。

注意:如果存在必需参数,则可选参数要声明在必需参数后面

// 位置参数
int sum(int a, int b, [int c]) {
  if (c != null) {
    return a + b + c;
  }
  return a + b;
}
print(sum(3, 5, 7));
// 命名参数
int multiply({int a = 1, int b = 2}) {
  return a * b;
}
print(multiply(a: 3, b: 5));

函数作为对象

与JavaScript中类似,在Dart中函数也是一种特殊类型的对象(并且有具体类型Function)。因此函数可以分配给变量或者作为参数传递给其他函数,也可以创建匿名函数。

// 匿名函数
var multiply = (int a, int b) {
  return a * b;
};
multiply(3, 5);
// 函数作为参数
void executeFunction(int Function(int, int) func) {
  print(func(3, 5));
}
executeFunction(multiply);
// 函数作为返回值
Function getOperation(String operation) {
  if (operation == 'add') {
    return add;
  } else if (operation == 'multiply') {
    return multiply;
  }
  return null;
}
var operation = getOperation('multiply');
print(operation(3, 5));

作用域与闭包

Dart中作用域和闭包的概念和JavaScript中是相似的,它们影响着变量的可见性范围和生命周期。Dart中有以下几种作用域:

  • 全局作用域(Global Scope):全局作用域中声明的变量在整个程序中都可以访问,在Dart中全局作用域是指在所有函数之外声明的变量。

  • 局部作用域(Local Scope):局部作用域中声明的变量只能在声明它们的函数内部访问,这意味着这些变量对于函数外部是不可见的。

  • 块级作用域(Block Scope)if语句、for循环、while循环等代码块可以形成一个块级作用域,在块级作用域中声明的变量只能在该代码块内部访问。

// 全局作用域
int globalVariable = 10;
void main() {
  // 局部作用域
  int localVariable = 20;
  if (true) {
    // 块级作用域
    int blockVariable = 30;
    print(globalVariable); // 可访问全局变量
    print(localVariable);  // 可访问局部变量
    print(blockVariable);  // 可访问块级变量
  }
  print(globalVariable); // 输出:10
  print(localVariable);  // 输出:20
  print(blockVariable);  // 编译错误:blockVariable 在此处不可见
}

函数闭包是指函数可以访问其所在作用域的变量,即使函数在其定义的作用域之外执行也可以访问这些变量。

Function makeCounter() {
  int count = 0;
  return () {
    count++;
    print(count);
  };
}
void main() {
  var counter = makeCounter();
  counter(); // 输出:1
  counter(); // 输出:2
  counter(); // 输出:3
}

Last updated