Из-за любопытства, но все еще неспособного найти ответ на тему производительности вопроса выше, я написал эту суть для nodejs, чтобы проверить как производительность, так и надежность всех представленных (и оцененных) решений.
Я сравнил настенное время создания функции клона и выполнения клона. Результаты вместе с ошибками утверждения включены в суть комментария.
Плюс мои два цента (по предложению автора):
clone0 cent (быстрее, но уродливее):
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 является то, что клон и исходная функция будут работать в разных областях. Это не будет хорошо работать с функциями, которые используют переменные с ограниченным объемом. Решения, использующие привязку, подобную связыванию, не зависят от области действия.