Функция makeAdder
возвращает функцию. Возвращаемая функция создается путем вычисления выражения функции (num i) => addBy + i
.
Когда вы оцениваете функцию выражение , вы создаете функцию значение . Значение функции также называется замыканием , поскольку оно содержит («закрывает») все «свободные» переменные в теле функции - те, которые не объявлены самим выражением функции
В этом случае выражение функции (num i) => addBy + i
содержит свободную переменную addBy
. Значение / замыкание функции знает, что означает эта переменная - это параметр вызова makeAdder
, в котором вычисляется выражение функции. Каждый вызов makeAdder
создает новую переменную addBy
, и каждый вызов также создает новую закрытие закрытия над этой новой переменной.
Замыкание не просто хранит значение переменной, оно ссылается на саму переменную . Вы можете видеть это, если ваше закрытие изменяет значение переменной.
* * Пример тысяча двадцать-один: * * 1 022
/// Creates a counter function which returns a new value each call.
///
/// The counter function starts at [start] and increments by [step]
/// each time it is called.
int Function() makeCounter([int start = 1, int step = 1]) {
var value = start - step;
return () => value += step;
}
main() {
var countFrom1 = makeCounter();
var countFast = makeCounter(1, 2);
var countFrom100 = makeCounter(100);
// Prints 1, 2, 3, 4, 5:
for (var i = 0; i < 5; i++) print(countFrom1());
// Prints 1, 3, 5, 7, 9:
for (var i = 0; i < 5; i++) print(countFast());
// Prints 100, 101, 102, 103, 104:
for (var i = 0; i < 5; i++) print(countFrom100());
print(countFrom1()); // Prints 6.
}