Задать вопрос
@Rafrey

Как f.toString здесь работает и расскажите, что происходит в этом коде?

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
  • Вопрос задан
  • 383 просмотра
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
@amokrushin
sum(0)(...)(n) всегда возвращает функцию f
Метод alert принимает на вход строку, поэтому в момент вызова alert выполняется автоматическое преобразование функции f к строке. По умолчанию метод f.toString функции вернул бы текст ее исходного кода, но для функции f метод был преопределен и теперь он возвращает значение currentSum из замыкания.
Казалось бы все хорошо, но это не так. В логических преобразованиях объект (в частном случае -
это функция) всегда true. Поэтому, хоть
console.log( Number(sum(5)(-5)) );
и возвращает 0, результат
console.log( Boolean(sum(5)(-5)) );
будет true.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
Функция, которая возвращает функцию, которая возвращает функцию и когда последняя функция попадает как аргумент alert, вызывается toString, который возвращает currentSum.
Ответ написан
@kulaeff
Front-end developer
Рассмотрим первый пример:

alert( sum(1)(2) ); // 3

В функции sum число 1 запоминается в переменной currentSum, далее объявляется функция (внутри sum) f, в которой currentSum складывается с аргументом этой функции (сумма при этом сохраняется в тот же currentSum) и возвращает саму себя, т.е. получается как-бы рекурсия. Далее, в инстанс (не в прототип) функции f добавляется метод toString (https://javascript.ru/object/tostring), которая автоматом вызывается, когда нужно строковое представление. Ключевые понятия для изучения: замыкания, область видимости переменной. Не помешает еще почитать про прототипы и наследование.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽
18 дек. 2024, в 13:22
30000 руб./за проект
18 дек. 2024, в 12:37
10000 руб./за проект
18 дек. 2024, в 12:22
5000 руб./за проект