evgeniy8705
@evgeniy8705
Повелитель вселенной

Преобразование объектов в JS (как понять решение задачи)?

Есть Задача:
Напишите функцию sum, которая будет работать так:
sum(1)(2) == 3; // 1 + 2
sum(1)(2)(3) == 6; // 1 + 2 + 3
sum(5)(-1)(2) == 6
sum(6)(-1)(-2)(-3) == 0
sum(0)(1)(2)(3)(4)(5) == 15
Количество скобок может быть любым.

Попробовал решить сам, но не смог, думал посмотрю решение, но и решение не очень мне понятно.

Решение:
function sum(a) {
  
  var 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


Напишите Коментарии или хоть как нибудь объясните как понять решение этой задачи.
  • Вопрос задан
  • 2474 просмотра
Решения вопроса 1
@kazmiruk
Если забить на термины и попытаться просто объяснить что происходит - первый вызов sum записывает переданное значение в переменную currentSum и создает функцию, которая сможет всегда достать эту переменную (это называется замыкание). Т. е. где бы и когда бы Вы не вызвали функцию f она всегда будет ссылаться на переменную currentSum (причем это не разные копии переменной, это именно одна и та же переменная). Затем созданная функция возвращается как результат sum. При вызове того, что вернулось из sum (т.е. вызове f) общение снова произойдет с currentSum. Т.е. примерно так:
sum(1)(2)(3) =>
sum(1) возвращает f и currentSum = 1
f(2) возвращает f и currentSum += 2 == 3
f(3) возвращает f и currentSum += 3 == 6
Ну и когда Вы захотите увидеть результат, то вступает в силу f.toString = function() { return currentSum; };, которая переопределяет метод, который вызывается при попытке отобразить функцию как строку. Так как f всегда возвращает f, то после последнего этапа currentSum будет равен 6 и вернется f. Делая alert(sum(1)(2)(3)) Вы по большому счету пытаетесь отобразить вернувшуюся функцию. Происходит обращение к toString, которая отображает именно currentSum, а не что-то другое. Это на пальцах. Но лучше почитать то, что Вам посоветовали.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
BOOMER_74
@BOOMER_74
Full-Stack разработчик
Каррирование, частичное применение, см. например тут.
Ответ написан
Ваш ответ на вопрос

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

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