Операторы возврата с использованием методов каррирования

#javascript #return #currying

#javascript #Возврат #каррирование

Вопрос:

Во время обучения в freeCodeCamp я столкнулся с вопросом о каррировании.

Решение было таким:

 function add(x) {
// Add your code below this line
return function(y) {
  return function(z) {
    return x   y   z;
    }
  }
}
add(10)(20)(30);
  

Однако я не понимаю, почему инструкции return здесь не завершают выполнение функции?

У меня создалось впечатление, что как только вы используете оператор return, эта строка будет выполнена, а все, что находится за ее пределами, будет проигнорировано.

Ответ №1:

Это завершает только собственную функцию. Возвращаемая функция еще не вызвана.

 function add(x) {
    return function(y) {      // 
        return function(z) {  //  |
            return x   y   z; //  | part of the returned function
        };                    //  |
    };                        // /
}

add(10)(20)(30);
  

Ответ №2:

Да, использование return действительно завершает выполнение функций, но возвращаемое значение представляет собой саму функцию, которая затем вызывается напрямую, выполняется следующая функция, завершающаяся return вводом другой функции, которая затем снова вызывается напрямую и выдает результат.

 add(10)(20)(30);

// evaluted to:
function(x) {
  return function(y) {
    return function(z) {
      return x   y   z;
    };
  };
}(10)(20)(30)

// evaluated to:
function(y) { // x = 10 through closure
   return function(z) {
     return x   y   z;
   };
}(20)(30);

// evaluated to
function(z) { // x = 10, y = 20 through closure
  return x   y   z;
}(30)

// evaluated to
60
  

Ответ №3:

Каждый раз, когда он возвращает новую функцию, она выполняется.

Ответ №4:

Вы были бы правы, если бы у одной функции было несколько операторов возврата, но в этом случае существует несколько функций (каждая со своим собственным оператором возврата). Две функции просто случайно возвращают другую функцию.