Per ora, ecco la soluzione migliore che potessi pensare.
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); };
}
};
Esempio utilizzo:
var realFn = function() {
return "blah";
};
lengthSix = makeFunc(6, realFn);
lengthSix.length; // 6
lengthSix(); // "blah"
Personalmente, ho sempre rabbrividire ogni volta che uso copiare e incollare in fase di programmazione, quindi sarei molto felice di sentire di tutte le opzioni migliori.
Aggiornamento
ho pensato ad un metodo che potrebbe funzionare per qualsiasi dimensione arbitraria, a differenza l'esempio precedente che è limitata dal numero di volte che si desidera copiare-e-incolla. Essenzialmente, crea dinamicamente una funzione (usando new Function
) che restituisce una funzione della giusta dimensione che quindi passa semplicemente a qualsiasi funzione che si passa ad essa. Sì, questo ti fa male alla testa. Ad ogni modo, ho pensato di confrontarlo con quanto sopra ...
http://jsperf.com/functions-with-custom-length (puoi vedere anche il codice "diabolico").
Il metodo malvagio è molte centinaia di volte più lento del metodo hacker copypasta, quindi eccovi.
Semplicemente interessante, quali sono le ragioni che ti spingono a pensare a questo problema? – shabunc
Perché vuoi impostare la lunghezza? Sapete che quando chiamate effettivamente una funzione potete passare meno degli argomenti "previsti", o più? (Se passi di più, la funzione può accedervi tramite il suo oggetto 'arguments'.) – nnnnnn
Fuori interesse, perché vuoi farlo? – Russell