Будучи любопытным, но все еще не способным найти ответ на вопрос производительности по приведенному выше вопросу, я написал это gist для nodejs, чтобы проверить производительность и надежность всех представленных (и оцененных) решений.
Я сравнил время стенда при создании функции клона и выполнении клона.
Результаты вместе с ошибками в утверждении включены в комментарий гисти.
Плюс два моих цента (по предложению автора):
клон0 цент (быстрее, но страшнее):
Function.prototype.clone = function() {
var newfun;
eval('newfun=' + this.toString());
for (var key in this)
newfun[key] = this[key];
return newfun;
};
clone4 cent (медленнее, но для тех, кто не любит eval () для целей, известных только им и их предкам):
Function.prototype.clone = function() {
var newfun = new Function('return ' + this.toString())();
for (var key in this)
newfun[key] = this[key];
return newfun;
};
Что касается производительности, то если eval / new Function работает медленнее, чем решение-обертка (и это действительно зависит от размера тела функции), она дает вам клон с голой функцией (и я имею в виду истинный мелкий клон со свойствами, но без общего ресурса) без лишних размышлений со скрытыми свойствами, функциями оболочки и проблемами со стеком.
Кроме того, всегда нужно учитывать один важный фактор: чем меньше кода, тем меньше мест для ошибок.
Недостатком использования функции eval / new является то, что клон и исходная функция будут работать в разных областях. Это не будет хорошо работать с функциями, которые используют переменные области видимости. Решения, использующие связывание в виде привязки, не зависят от области действия.