Лексическая область действия
лексическая переменная области действия / закрытие и т. Д. c доступен только в пределах блока кода, в котором она определена.
Dart - это лексически ограниченный язык , С лексической областью видимости области потомка получат доступ к самой последней объявленной переменной с тем же именем. Сначала ищется самая внутренняя область видимости, а затем выполняется поиск по внешним областям.
Вы можете «следовать за фигурными скобками наружу», чтобы увидеть, находится ли переменная в области действия.
См. Следующий пример.
main() { //a new scope
String language = "Dart";
void outer() {
//curly bracket opens a child scope with inherited variables
String level = 'one';
String example = "scope";
void inner() { //another child scope with inherited variables
//the next 'level' variable has priority over previous
//named variable in the outer scope with the same named identifier
Map level = {'count': "Two"};
//prints example: scope, level:two
print('example: $example, level: $level');
//inherited from the outermost scope: main
print('What Language: $language');
} //end inner scope
inner();
//prints example: scope, level:one
print('example: $example, level: $level');
} //end outer scope
outer();
} //end main scope
Лексические замыкания
Замыкание - это функциональный объект, который имеет доступ к переменным в своей лексической области видимости, даже когда функция используется за пределами его первоначального объема.
/// Returns a function that adds [addBy] to the
/// function's argument.
Function makeAdder(num addBy) {
return (num i) => addBy + i;
}
void main() {
// Create a function that adds 2.
var add2 = makeAdder(2);
// Create a function that adds 4.
var add4 = makeAdder(4);
assert(add2(3) == 5);
assert(add4(3) == 7);
}
Подробнее о можно прочитать здесь .