Currying преобразует функцию, принимающую несколько аргументов, в последовательность функций, каждая из которых принимает один или несколько аргументов. Функция откладывает выполнение до тех пор, пока не будут собраны все необходимые аргументы.
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
}
return function (...moreArgs) {
return curried.apply(this, [...args, ...moreArgs]);
};
};
}
fn.length возвращает ожидаемое количество аргументов исходной функцииfn вызывается сразу через fn.apply(this, args)[...args, ...moreArgs]const add = (a, b, c) => a + b + c;
const curriedAdd = curry(add);
curriedAdd(1)(2)(3); // 6
curriedAdd(1, 2)(3); // 6
curriedAdd(1)(2, 3); // 6
apply с this для правильного сохранения контекстаfn.length для определения арности функцииСвойство fn.length возвращает фактическое количество аргументов, переданных функции во время выполнения, позволяя функции curry узнать, когда все требуемые аргументы были предоставлены.
Новый — ещё не проверен сообществом
Вы