Jest ciekawy, ale nadal nie można znaleźć odpowiedzi na temat wydajności powyższe pytanie, napisałem to sens dla nodejs przetestować zarówno wydajność i niezawodność wszystkich prezentowanych (i goli) rozwiązań.
Porównałem czasy tworzenia funkcji klonowania i wykonywania klonów. Wyniki wraz z błędami asercji są zawarte w komentarzu do istoty.
Plus moje dwa grosze (na podstawie sugestii autora):
clone0 cent (szybszy, ale brzydszy):
Function.prototype.clone = function() {
var newfun;
eval('newfun=' + this.toString());
for (var key in this)
newfun[key] = this[key];
return newfun;
};
clone4 cent (wolniej, ale dla tych, którzy nie lubią eval () do celów znanych tylko im i ich przodkom):
Function.prototype.clone = function() {
var newfun = new Function('return ' + this.toString())();
for (var key in this)
newfun[key] = this[key];
return newfun;
};
Jeśli chodzi o wydajność, jeśli eval / new Function jest wolniejsze niż rozwiązanie wrapper (i naprawdę zależy to od rozmiaru ciała funkcji), daje ci klon czystej funkcji (i mam na myśli prawdziwy płytki klon z właściwościami, ale stanem niewspółdzielonym) bez niepotrzebnego rozmycia z ukrytymi właściwościami, funkcjami opakowania i problemami ze stosem.
Ponadto zawsze jest jeden ważny czynnik, który należy wziąć pod uwagę: im mniej kodu, tym mniej miejsc na błędy.
Wadą korzystania z funkcji eval / new jest to, że klon i oryginalna funkcja będą działać w różnych zakresach. Nie będzie działać dobrze z funkcjami, które używają zmiennych o określonym zakresie. Rozwiązania wykorzystujące zawijanie podobne do wiązania są niezależne od zakresu.