📜  什么是Dart的词法范围和词法闭包(1)

📅  最后修改于: 2023-12-03 14:49:10.372000             🧑  作者: Mango

什么是Dart的词法范围和词法闭包

在Dart语言中,词法范围和词法闭包是一种十分重要的概念,深入理解这些概念能够更好地掌握Dart语言的编程思想和实践。

词法范围

Dart语言中,词法范围(Lexical Scope)就是指代码所包含的作用域。Dart语言采用静态作用域(Static Scope),也就是说,作用域在编码阶段就已经确定了。在Dart语言中,通过使用花括号({})来定义代码块,每个代码块都有一个独立的作用域。

void main() {
  int a = 10;
  {
    int b = 20;
    print(a); // 输出 10
    print(b); // 输出 20
  }
  print(b); // 报错:undefined name 'b'
}

在上面的示例代码中,a 的作用域就是 main 函数,而 b 的作用域只是代码块 {} 内部。

词法闭包

Dart语言中,词法闭包(Lexical Closure)是指函数和该函数所在的词法范围的集合。换句话说,词法闭包包含了函数和在函数内定义的所有变量以及该函数所在的词法范围的所有变量。

Function makeAdder(num addBy) {
  return (num i) => addBy + i;
}

void main() {
  final adder = makeAdder(5);
  print(adder(10)); // 输出 15
}

在上面的示例代码中,makeAdder 函数返回了一个匿名函数,该匿名函数使用了 makeAdder 的参数 addBy。当 makeAdder(5) 被调用时,它返回一个闭包:一个函数对象和一个 addBy 变量的环境。adder 变量被赋值为这个闭包的函数。当 adder(10) 被调用时,它将 addByi 相加,得到结果 15

在Dart语言中,词法闭包的重要性在于对函数作用域的扩展。通过使用闭包,函数可以访问其外部作用域中的变量和函数,而这些变量和函数在函数被调用时可以被保留和利用。这使得Dart语言具有更好的灵活性和扩展性。