Estoy tratando de entender funciones parciales. Encontré este ejemplo (http://blog.thesoftwarecraft.com/2013/05/partial-functions-in-javascript.html) y soy incapaz de entender completamente.
function partial(f) {
console.log(f) // tip(p,check)
var args = Array.prototype.slice.call(arguments, 1); //0.2
var test_args = Array.prototype.slice.call(arguments);
console.warn(test_args) // [tip(p,check), 0.2]
return function () {
console.warn(arguments) //[120, 0, [120, 90, 180]] [90, 0, [120, 90, 180]] ...
//where do these arguments come from? why don"t appear at test_args?
var other_args = Array.prototype.slice.call(arguments); //[120, 0, [120, 90, 180]] [90, 0, [120, 90, 180]] ...
console.log(args.concat(other_args)) // added percentage to array[0.2, 120, 0, [120, 90, 180]]
return f.apply(null, args.concat(other_args)); //we execute tip with all the arguments (only 2 first will be used)
}
}
function tip(percentage, check) {
return check * percentage
}
[120, 90, 180].map(partial(tip, 0.2)); //[24, 18, 36]
Respuestas
0 para la respuesta № 1return function () { console.warn(arguments) //[120, 0, [120, 90, 180]] [90, 0, [120, 90, 180]] ...
¿De dónde vienen estos argumentos? ¿Por qué no aparece en test_args?
Porque es una función nueva, la que se devuelve, que tiene una nueva arguments
objeto. Puedes consultar aquí:
var tipper = partial(tip,0.2);
[120, 90, 180].map(function(el) {
console.log(arguments); // here they are!
return tipper(el);
});
1 para la respuesta № 2
En la teoría de los lenguajes de programación esto se conoce como aplicación parcial. Básicamente toma su función que requiere. norte argumentos y n-k Argumentos y devuelve una función que tiene k argumentos mediante la aplicación parcial de estos previstos n-k argumentos
Toma este ejemplo en un pseudo código
function mul(x, y)
return x*y
function mul2
return mul(2)
var a = f(1,2); // 3
var b = mul2(4); // 8
Aunque la función toma 2 argumentos (norte), puede hacer otra función fuera de ella aplicando solo 1 argumento (n-k). La nueva función solo requerirá un argumento (k)
Tu partial
tiene una función y su arguments
. Almacena estos argumentos en el args
variable. Luego devuelve la función interna que toma sus argumentos, pero como tiene que combinar el n-k argumentos de la función de nivel superior con k Argumentos de la función interna, tienes. concat
y la lista completa se pasa a la función original.
Edit: como señala Andreas en el comentario, esto no se llama zurra. El resto de la respuesta aún se mantiene.