Dart 变量作用域与闭包

Dart 中的变量作用域

全局变量

在函数外定义的变量被称为全局变量,作用域为全局。

优点 : 全局可用。缺点 : 容易被污染

局部变量

在函数内定义的变量被称为局部变量,作用域为局部。

优点 : 不容易被污染。缺点 : 局部使用。

// 全局变量
String name = "lesscode";

void main(List<String> args) {
  print(name);
  // 局部变量
  String nameIn = "lesscode";
  print(nameIn);
}

闭包

闭包 即一个函数对象,即使函数对象的调用在它原始作用域之外,依然能够访问在它词法作用域内的变量。

示例

// 闭包示例
Function consume() {
  // 存款数
  int deposit = 1000;
  return () {
    deposit -= 100;
    print(deposit);
  };
}

void main(List<String> args) {
  Function consumeFunc = consume();
  consumeFunc();
  consumeFunc();
}

原理说明

在 consume 函数中,我们定义了一个 deposit 局部变量用于保存用户余额,之后我们使用 return 关键字返回了一个匿名函数。在外部调用时我们接收了此返回函数( 我们称之为子函数 ,也称作内存函数  ),当子函数执行完成后会释放自己,但并不会释放父函数 consume() ,这样 desposit 变量被持续保留。达到了在函数 consume() 外部控制内部局部变量的目的。