Dart 変数とスコープ

Dartにおけるスコープ(変数の有効範囲)は、C系の言語とほぼ共通です。
宣言と同じ中括弧”{}”内であればその変数へアクセスすることが出来ます。

var global_a = 1;
void main(){
	var main_var = 2;
	if (true){
		var inside_var = 3;
		var total = global_a + main_var + inside_var;
		print(total); // OK
	}
	print(inside_var); // error inside_varの宣言された中括弧の外ではinside_varにアクセスできない
}

例外 クロージャー

上記の唯一の例外がクロージャーとなります。匿名関数を返すような場合に利用可能な概念となり、この場合、中括弧の範囲を超えて、当該無名関数がメモリ上に展開された時点でのスコープを参照できます。

void main(){

  // Function型を返す関数
  Function addNum(int num){
    return (int i) => num + i; // 返されるFunction(無名関数/匿名関数)
  }

  Function a = addNum(2); // 返される関数は int (i) { return 2+i; }
  Function b = addNum(3); // 返される関数は int (i) { return 3+i; }

  print(a(1)); // 3を返す
  print(b(10)); // 13を返す
}