Каждый непустой вызов возвращает новое замыкание с накопленной суммой. Пустой вызов завершает цепочку и возвращает число; add() без исходных аргументов даёт 0.
Функция сложения с поддержкой частичного вызова
Каждый непустой вызов возвращает новое замыкание с накопленной суммой. Пустой вызов завершает цепочку и возвращает число; add() без исходных аргументов даёт 0.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте функцию add, умеющую принимать аргументы частично. Она должна позволять вызывать её последовательно, каждый раз добавляя к общему результату переданные числа. Если вызвать функцию без параметров, она должна вернуть накопленную сумму.
Ответ
Каждый непустой вызов возвращает новое замыкание с накопленной суммой. Пустой вызов завершает цепочку и возвращает число; add() без исходных аргументов даёт 0.
function add(...values) {
function collect(total) {
return (...next) => next.length
? collect(next.reduce((sum, value) => sum + value, total))
: total;
}
return values.length
? collect(values.reduce((sum, value) => sum + value, 0))
: 0;
}
add(1)(2, 3)(4)(); // 10
const plusOne = add(1);
plusOne(2)(); // 3
plusOne(5)(); // 6
Предполагаются числовые аргументы. Замыкания не изменяют предыдущее накопленное значение, поэтому ответвления одной цепочки не влияют друг на друга.