Essere curiosi, ma ancora in grado di trovare la risposta al tema prestazioni della domanda di cui sopra, ho scritto questo succo per nodejs alla prova sia le prestazioni e l'affidabilità di tutte le soluzioni presentate (e ha ottenuto).
Ho confrontato i tempi del muro della creazione di una funzione clone e l'esecuzione di un clone. I risultati insieme agli errori di asserzione sono inclusi nel commento dell'essenza.
Più i miei due centesimi (in base al suggerimento dell'autore):
clone0 cent (più veloce ma più brutto):
Function.prototype.clone = function() {
var newfun;
eval('newfun=' + this.toString());
for (var key in this)
newfun[key] = this[key];
return newfun;
};
clone4 cent (più lento ma per coloro a cui non piace eval () per scopi noti solo a loro e ai loro antenati):
Function.prototype.clone = function() {
var newfun = new Function('return ' + this.toString())();
for (var key in this)
newfun[key] = this[key];
return newfun;
};
Per quanto riguarda le prestazioni, se la funzione eval / new è più lenta della soluzione wrapper (e dipende davvero dalla dimensione del corpo della funzione), ti dà il clone della funzione nuda (e intendo il vero clone superficiale con proprietà ma stato non condiviso) senza fuzz non necessario con proprietà nascoste, funzioni wrapper e problemi con lo stack.
Inoltre c'è sempre un fattore importante da prendere in considerazione: meno codice, meno posti per errori.
Lo svantaggio dell'utilizzo della funzione eval / new è che il clone e la funzione originale funzioneranno in ambiti diversi. Non funzionerà bene con le funzioni che utilizzano variabili con ambito. Le soluzioni che utilizzano il wrapping di tipo bind sono indipendenti dall'ambito.