Garfields
@Garfields

Как работает данный код?

Не могу понять откуда столько вызовов alert( sum(0)(1)(2)(3)(4)(5) ); // 15
и почему вложенная функция возвращает саму себя(получается рекурсия?), а так же почему внешняя возвращает вложенную?

UPD: Я прошу объяснить, как работает данный код, а не что это такое.

Буду благодарен за объяснение.

function sum(a) {

  let currentSum = a;

  function f(b) {
    currentSum += b;
    return f;
  }

  f.toString = function() {
    return currentSum;
  };

  return f;
}

alert( sum(1)(2) ); // 3
alert( sum(5)(-1)(2) ); // 6
alert( sum(6)(-1)(-2)(-3) ); // 0
alert( sum(0)(1)(2)(3)(4)(5) ); // 15
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Функция sum() возвращает функцию f.
Функция f() тоже возвращает функцию f.

Но к результату можно обратиться по-разному:
  1. вызвать как функицию – вторая и последующие скобки;
  2. попытаться вывести как строку – метод alert() ожидает именно строку, а не функцию и не объект.
    На второй случай у f определён «волшебный» метод toString().
    Подробнее: преобразование объектов в примитивы
    Недавно был вопрос про это: Почему оператор сложения + складывает массивы как строки?


При этом значение суммы накапливается в переменной currentSum, которая определяется при (первом) вызове sum(), а при последующих вызовах f() это значение по-прежнему «видно».
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@vshvydky
Через замыкание
Ответ написан
Stalker_RED
@Stalker_RED
почему возвращает, и почему возвращает

Странный вопрос. Возвращает потому, что так написано в коде. типа return f, вот она и возвращает.

Если вопрос на самом деле не "почему", а "зачем так сделали", или "как это работает" или "делает ли кто-нибудь такое в реальных проектах", то так и спрашивайте :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы