Dartにおけるスコープ(変数の有効範囲)は、C系の言語とほぼ共通です。
宣言と同じ中括弧”{}”内であればその変数へアクセスすることが出来ます。
Dart
x
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にアクセスできない
}
例外 クロージャー
上記の唯一の例外がクロージャーとなります。匿名関数を返すような場合に利用可能な概念となり、この場合、中括弧の範囲を超えて、当該無名関数がメモリ上に展開された時点でのスコープを参照できます。
Dart
xxxxxxxxxx
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を返す
}