Пытаюсь обернуть голову вокруг замыканий в Дарт - PullRequest
0 голосов
/ 28 июня 2018

Я сейчас изучаю Google Dart. В настоящее время я запутался, пытаясь понять, что происходит в этом фрагменте кода, взятом из dart docs:

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

Что мне так трудно понять, так это части add2(3) и add(3). makeAdder(2) и makeAdder(4) из того, что я собрал, присваивает переменную addBy 2 и 4 соответственно в их собственной области видимости. Таким образом, переменная add2 имеет 2, назначенные для addBy, а переменная add4 имеет 4, назначенные для addBy. Но я не совсем понимаю: при выполнении функции с параметрами (т. Е. add2(3) и add4(3)) параметры не должны присваивать переменную addBy, поэтому addBy должны быть равны 3 соответственно переменные? и как Дарт знает, как назначить i 3 вместо addBy?

Надеюсь, в этом есть смысл.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

makeAdder возвращает здесь функцию. Функция, которую вы возвращаете из makeAdder, в основном ближе. Как только вы вызовете makeAdder с аргументом, его значение сохранится в параметре addBy. Поэтому, когда вы делаете вызов наподобие makeAdder (2) (3), он возвращает 5.

В простом javascript эта функция будет такой, как показано ниже -

var makeAdder = function(addBy) {
    return (param) => { 
        return addBy+param;
    }
}

Внутренняя функция - это простая функция стрелки. Если мы вызовем makeAdder как makeAdder (5) (6), он вернет 11

0 голосов
/ 28 июня 2018

makeAdder принимает один параметр (addBy) и возвращает функцию, которая также принимает один параметр (i).

Когда вы вызываете var add2 = makeAdder(2), аргумент 2 здесь передается addBy, и функция возвращает лямбда-эквивалент, эквивалентный:

num add2(num i) { 
  return 2 + i;
}

Позже, когда вы вызываете add2(3), аргумент 3 передается i.

Ключ к пониманию того, что makeAdder возвращает функцию, которая принимает параметр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...