Будучи цікавим, але все ще не в змозі знайти відповідь на тему ефективності вищезазначеного питання, я написав цю суть для 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 полягає в тому, що клон і оригінальна функція будуть працювати в різних сферах. Він не буде добре працювати з функціями, які використовують масштабовані змінні. Рішення, що використовують в'яжучу упаковку, не залежать від обсягу.