Ваш func
принимает три аргумента: a
, b
и c
. Когда вы делаете:
return func(n.concat(args2));
вы передаете его один аргумент, массив. Это эквивалентно:
const arr = n.concat(args2);
return func(arr);
Звучит так, как если бы вы хотели распространить аргументы в вызове func
вместо:
return func(...n, ...args2)
С синтаксисом расширения каждый элемент из повторяемого объекта помещается в параметр. Например, если массив n
имеет один элемент, он устанавливается как первый аргумент, переданный func
, а если args2
имеет 2 элемента, первый устанавливается как второй передаваемый аргумент, а второй устанавливается как передан третий аргумент.
function sum(a, b, c) {
console.log('SUM' + JSON.stringify(arguments))
return a + b + c;
}
var curry = function(func, ...n) {
return function(...args2) {
return func(...n, ...args2);
};
}
curry(sum, 1, 2)(3);
Как изменить свою функцию так, чтобы я мог вызывать ее, как показано ниже, и должен возвращать сумму: curry (1) (2) (3) / curry (1,2) (3) / curry (1,2,3) et c
Отслеживайте общее количество аргументов, переданных в замыкании, создавшем first раз функция вызывается. В возвращенной функции pu sh все аргументы массива, а если длина массива равна 3, вернуть сумму, в противном случае вернуть функцию снова:
function sum(a, b, c) {
return a + b + c;
}
var curry = function(func, ...argsSoFar) {
const neededArgs = func.length;
const returnedFn = (...args) => {
argsSoFar.push(...args);
if (argsSoFar.length === neededArgs) {
return func(...argsSoFar);
} else {
return returnedFn;
}
};
return returnedFn;
}
console.log(
curry(sum, 1, 2)(3),
curry(sum)(1, 2)(3),
curry(sum)(1)(2, 3),
curry(sum)(1)(2)(3),
);