Por ahora, aquí está la mejor solución que podría pensar.
makeFunc = function (length, fn) {
switch (length) {
case 0 : return function() { return fn.apply(this, arguments); };
case 1 : return function (a) { return fn.apply(this, arguments); };
case 2 : return function (a,b) { return fn.apply(this, arguments); };
case 3 : return function (a,b,c) { return fn.apply(this, arguments); };
case 4 : return function (a,b,c,d) { return fn.apply(this, arguments); };
case 5 : return function (a,b,c,d,e) { return fn.apply(this, arguments); };
case 6 : return function (a,b,c,d,e,f) { return fn.apply(this, arguments); };
case 7 : return function (a,b,c,d,e,f,g) { return fn.apply(this, arguments); };
case 8 : return function (a,b,c,d,e,f,g,h) { return fn.apply(this, arguments); };
case 9 : return function (a,b,c,d,e,f,g,h,i) { return fn.apply(this, arguments); };
default : return function (a,b,c,d,e,f,g,h,i,j) { return fn.apply(this, arguments); };
}
};
Ejemplo de uso:
var realFn = function() {
return "blah";
};
lengthSix = makeFunc(6, realFn);
lengthSix.length; // 6
lengthSix(); // "blah"
lo personal, siempre encogerse cada vez que use copiar y pegar en la programación, por lo que estaría muy feliz de escuchar de cualquier opción mejor.
actualización
pensé en un método que podría funcionar para cualquier tamaño arbitrario, a diferencia del ejemplo anterior que está limitada por la cantidad de veces que desea copiar y pegar. Esencialmente, crea dinámicamente una función (usando new Function
) que devolverá una función del tamaño correcto que luego se aproxima a cualquier función que le pase. Sí, eso te lastima la cabeza. De todos modos, pensé que lo compararía con el anterior ...
http://jsperf.com/functions-with-custom-length (aquí también se puede ver el código "malo").
El método malvado es cientos de veces más lento que el método pirata copypasta, así que ahí lo tienes.
Simplemente interesante, ¿cuáles son las razones que lo hacen pensar siquiera en este tema? – shabunc
¿Por qué quieres establecer la longitud? ¿Sabe que cuando llama a una función puede pasar menos que los argumentos "esperados", o más? (Si pasa más, la función puede acceder a ellos a través de su objeto 'arguments'.) – nnnnnn
Fuera de interés, ¿por qué quiere hacer esto? – Russell