¿Alguien puede escribir una función Javascript que haga esto: add (1) (2) (8) debería devolver 11, es decir, la suma de los argumentos dados (el número de argumentos puede ser cualquier número natural)?

Es bastante sencillo.

función add (a) {
var sum = a

función add_and_repeat (b) {
si (b) {
suma + = b
volver add_and_repeat
}
más
suma de retorno;
}

add_and_repeat.toString = function () {return sum}

volver add_and_repeat
}

La función “add” devolverá otra función “add_and_repeat”, que cuando se llama solo se devuelve a sí misma (no realmente a sí misma sino más bien como una versión copiada de sí misma). Esto significa que siempre devolverá una función, entonces, ¿cómo se obtiene el valor? Cada función tiene un Function.prototype.toString () que se puede ajustar para devolver la suma. El único inconveniente de esto es que el tipo de valor devuelto será “función” y no un “número” como cabría esperar. Para eso he agregado una condición If, así que ahora si pones un () al final, el tipo de valor devuelto será una suma.

Considere el siguiente truco:
add = función (a) {
var sum = a;
funct = function (b) {
suma + = b;
función de retorno;
};

Object.defineProperty (funct, ‘valueOf’, {
valor: función () {
suma de retorno;
}
});
función de retorno;
};
console.log (1 + add (1) (2) (8));

Esto generalmente funcionaría en la mayoría de los escenarios.

Parece que estás hablando de curry:
Zurra

Lodash tiene una implementación para eso:
documentación de lodash

algo como:

función sum_abc (a, b, c) {
devuelve a + b + c;
}

var sum = _.curry (sum_abc):
suma (1) (2) (3); // 6

función add () {
var slice = Array.prototype.slice,
suma = 0,
cierre = función () {
var cargs = slice.call (argumentos);
for (var i = 0, l = cargs.length; i suma + = cargs [i] * 1;
}
volver cargs.length? cierre: suma;
};
return close.apply (null, slice.call (argumentos));
}

sumar (1,2,7) (5) (4) (2,3) (‘3.14’, 2.86); // función
agregar (1,2,7) (5) (4) (2,3) (‘3.14’, 2.86) (); // 30

función agregar (s) {
función h () {
return add2 (eval (argumentos.toSource ()));
};
función add2 (args) {
para (var j en args)
t + = args [j];
volver h;
}
var t = 0;
h.valueOf = function () {return t};
return add2 (eval (argumentos.toSource ()));
}

console.log (+ add (1,2) (3,4) (5,6,7) () (8)); // 36
console.log (+ add (3) (5)); // 8
console.log (+ add (4) () (6)); // 10
console.log (+ add (8) () (9)); // 17

Cierres!

función suma (a) {
función de retorno (b) {
función de retorno (c) {
devuelve a + b + c;
}
}
}

Este problema está en curry ..

función add (x) {

función de retorno sum (y) {

if (typeof y! == ‘undefined’) {

x = x + y;

suma de retorno

} más {

volver x;

}

};

}

let p = add (1) (2) (3) (); // registros 6