Цель: создать функцию, которая суммирует аргументы из цепочки вызовов, используя технику каррирования.
sum
должна принимать первый аргумент и возвращать другую (внутреннюю) функцию.sum
вызвана без аргументов (sum()
), она должна сразу вернуть 0
.const sum = (initialValue) => {
// Если sum() вызвана без аргументов, возвращаем 0.
if (initialValue === undefined) {
return 0;
}
// Сохраняем текущую сумму в замыкании.
let total = initialValue;
// Возвращаем внутреннюю функцию, которая будет обрабатывать
// последующие вызовы в цепочке.
const innerFunc = (nextValue) => {
// Если внутреннюю функцию вызвали без аргументов (например, ...() ),
// это сигнал для завершения. Возвращаем накопленную сумму.
if (nextValue === undefined) {
return total;
}
// Если передан аргумент, добавляем его к сумме
// и возвращаем саму себя для продолжения цепочки.
total += nextValue;
return innerFunc;
};
return innerFunc;
};
Пошаговое объяснение кода:
const sum = (initialValue) => { ... }
sum
— это внешняя функция, которая запускает процесс. Она принимает необязательный initialValue
.initialValue
не передан (sum()
), мы сразу возвращаем 0
.let total = initialValue;
total
для хранения накопленной суммы. Она “замкнута” и будет доступна для внутренней функции innerFunc
при каждом последующем вызове.const innerFunc = (nextValue) => { ... }
sum
и обрабатывает все последующие вызовы.if (nextValue === undefined)
: Мы проверяем, был ли передан аргумент. Если нет (()
), это означает конец цепочки, и мы возвращаем total
.total += nextValue;
: Если аргумент есть, мы прибавляем его к total
.return innerFunc;
: Самое главное — мы возвращаем саму функцию innerFunc
. Это позволяет вызывать ее снова и снова, создавая цепочку.Почему это работает (магия замыканий):
Каждый раз, когда вы вызываете sum(5)
, создается новая область видимости с переменной total = 5
и возвращается innerFunc
, которая “помнит” эту total
. Когда вы вызываете (10)
, innerFunc
обновляет total
до 15
и снова возвращает себя. Этот процесс продолжается до тех пор, пока вы не вызовете ()
, что завершит цепочку.
Вам необходимо реализовать функцию sum
, которая позволяет суммировать числа, передаваемые в нее последовательно через цепочку вызовов. Особенность функции в том, что она должна возвращать накопленную сумму только тогда, когда ее вызывают без аргументов.
Эта техника известна как каррирование (или частичное применение) и является мощным инструментом функционального программирования в JavaScript.
// Примеры работы функции:
sum(); // Вернет 0
sum(5)(); // Вернет 5
sum(5)(10)(); // Вернет 15
sum(5)(10)(15)(); // Вернет 30
// Вызов без аргументов
sum(); // 0
// Один аргумент
sum(13)(); // 13
// Два аргумента
sum(5)(5)(); // 10
// Несколько аргументов
sum(10)(7)(41)(); // 58
// Работа с отрицательными числами
sum(10)(-5)(); // 5
sum
.sum()
без аргументов должен возвращать 0
.sum(a)(b)...(n)()
должен возвращать сумму всех переданных чисел.Цель: создать функцию, которая суммирует аргументы из цепочки вызовов, используя технику каррирования.
sum
должна принимать первый аргумент и возвращать другую (внутреннюю) функцию.sum
вызвана без аргументов (sum()
), она должна сразу вернуть 0
.const sum = (initialValue) => {
// Если sum() вызвана без аргументов, возвращаем 0.
if (initialValue === undefined) {
return 0;
}
// Сохраняем текущую сумму в замыкании.
let total = initialValue;
// Возвращаем внутреннюю функцию, которая будет обрабатывать
// последующие вызовы в цепочке.
const innerFunc = (nextValue) => {
// Если внутреннюю функцию вызвали без аргументов (например, ...() ),
// это сигнал для завершения. Возвращаем накопленную сумму.
if (nextValue === undefined) {
return total;
}
// Если передан аргумент, добавляем его к сумме
// и возвращаем саму себя для продолжения цепочки.
total += nextValue;
return innerFunc;
};
return innerFunc;
};
Пошаговое объяснение кода:
const sum = (initialValue) => { ... }
sum
— это внешняя функция, которая запускает процесс. Она принимает необязательный initialValue
.initialValue
не передан (sum()
), мы сразу возвращаем 0
.let total = initialValue;
total
для хранения накопленной суммы. Она “замкнута” и будет доступна для внутренней функции innerFunc
при каждом последующем вызове.const innerFunc = (nextValue) => { ... }
sum
и обрабатывает все последующие вызовы.if (nextValue === undefined)
: Мы проверяем, был ли передан аргумент. Если нет (()
), это означает конец цепочки, и мы возвращаем total
.total += nextValue;
: Если аргумент есть, мы прибавляем его к total
.return innerFunc;
: Самое главное — мы возвращаем саму функцию innerFunc
. Это позволяет вызывать ее снова и снова, создавая цепочку.Почему это работает (магия замыканий):
Каждый раз, когда вы вызываете sum(5)
, создается новая область видимости с переменной total = 5
и возвращается innerFunc
, которая “помнит” эту total
. Когда вы вызываете (10)
, innerFunc
обновляет total
до 15
и снова возвращает себя. Этот процесс продолжается до тех пор, пока вы не вызовете ()
, что завершит цепочку.
Вам необходимо реализовать функцию sum
, которая позволяет суммировать числа, передаваемые в нее последовательно через цепочку вызовов. Особенность функции в том, что она должна возвращать накопленную сумму только тогда, когда ее вызывают без аргументов.
Эта техника известна как каррирование (или частичное применение) и является мощным инструментом функционального программирования в JavaScript.
// Примеры работы функции:
sum(); // Вернет 0
sum(5)(); // Вернет 5
sum(5)(10)(); // Вернет 15
sum(5)(10)(15)(); // Вернет 30
// Вызов без аргументов
sum(); // 0
// Один аргумент
sum(13)(); // 13
// Два аргумента
sum(5)(5)(); // 10
// Несколько аргументов
sum(10)(7)(41)(); // 58
// Работа с отрицательными числами
sum(10)(-5)(); // 5
sum
.sum()
без аргументов должен возвращать 0
.sum(a)(b)...(n)()
должен возвращать сумму всех переданных чисел.Редактор кода намеренно скрыт на мобильном.
Поверь, так лучше: я оберегаю тебя от искушения писать код в неидеальных условиях. Маленький экран и виртуальная клавиатура — не лучшие помощники для программиста.
📖 Сейчас: Изучи задачу, продумай решение. Действуй как стратег.
💻 Потом: Сядь за компьютер, открой сайт и реализуй все идеи с комфортом. Действуй как код-джедай!