Dart.Откуда появился аргумент анонимной функции? - PullRequest
0 голосов
/ 06 июля 2018

В приведенном ниже примере есть (num i) материал, где он получает значение, когда makeAddr() вызывается?

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);
}

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Функция 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.
}
0 голосов
/ 06 июля 2018

Это закрытие. Когда makeAdder возвращается, он возвращает функцию, уже имеющую addBy в области, и эта область заморожена.

...