Sendo curioso, mas ainda incapaz de encontrar a resposta para o tópico de desempenho da pergunta acima, escrevi esta essência para nodejs para testar o desempenho e a confiabilidade de todas as soluções apresentadas (e pontuadas).
Eu comparei os tempos de parede da criação de uma função de clone e a execução de um clone. Os resultados, juntamente com os erros de asserção, estão incluídos no comentário da essência.
Mais meus dois centavos (com base na sugestão do autor):
clone0 cent (mais rápido, mas mais feio):
Function.prototype.clone = function() {
var newfun;
eval('newfun=' + this.toString());
for (var key in this)
newfun[key] = this[key];
return newfun;
};
clone4 cent (mais lento, mas para aqueles que não gostam de eval () para fins que só eles e seus ancestrais conhecem):
Function.prototype.clone = function() {
var newfun = new Function('return ' + this.toString())();
for (var key in this)
newfun[key] = this[key];
return newfun;
};
Quanto ao desempenho, se eval / new Function for mais lento do que a solução do wrapper (e realmente depende do tamanho do corpo da função), ele fornece um clone de função simples (e eu quero dizer o clone superficial verdadeiro com propriedades, mas estado não compartilhado) sem fuzz desnecessário com propriedades ocultas, funções de invólucro e problemas com pilha.
Além disso, há sempre um fator importante que você precisa levar em consideração: quanto menos código, menos espaços para erros.
A desvantagem de usar a função eval / new é que o clone e a função original irão operar em escopos diferentes. Não funcionará bem com funções que usam variáveis de escopo. As soluções que usam encapsulamento tipo bind são independentes do escopo.