Ich glaube nicht, new Function()
ist tragfähiger Verwendung für die meisten Funktionen auch ohne Leistungsprobleme, weil im Gegensatz zu function() {}
keine Schließung erstellt wird. Die kompilierte Funktion hat nur Zugriff auf ihren eigenen lokalen Bereich und das globale Objekt. Denken Sie eine Sekunde darüber nach. Javascript ohne Closures ist wie Java ohne Klassen oder C ohne Zeiger. Offensichtlich würde alles kaputt gehen.
Wenn Sie diesen Alias nur für kurze lambada-ähnliche Ausdrücke verwenden möchten, die keine Clouser benötigen, ist es eine naheliegende Möglichkeit, die Parameter deceleration zu verlassen. Einfach davon ausgehen, dass a = arguments[0]; b = arguments[1];
etc ...
$=function(b){return new Function('a,b,c,d,e,f,g,h,i,j', b);};
Eine andere Möglichkeit, automatisch wäre, den Wert des letzten Ausdrucks zurück, anstatt sie benötigen, um explizit
$=function(body) {
return function(a,b,c,d,e,f,g,h,i,j) { return eval(body); };
};
Horrifying es wird nicht erklärt werden? Dies funktioniert, weil eval()
... Nun, es gibt den Wert des letzten ausgewerteten Ausdruck zurück. No return
benötigt. Natürlich ist diese Methode ein noch größerer Erfolg, da der Code in body
jedes Mal neu bewertet wird, wenn die Funktion aufgerufen wird, während der Code mit new Function
nur einmal kompiliert wird (oder sollte).
Anyways Leistung gestaut werden, mit der bisherigen Methode, um Ihre Funktionsdeklaration zu diesem
var myeyes = $('a+b+c');
alert(myeyes(1,2,3)); //6
Purdy ist nach unten nicht wahr? Trotzdem, ich denke, es würde besser so aussehen
'a+b+c'
Sieht aus wie eine Zeichenfolge ja? Gut...es ist ein Stachel, aber in den Händen der richtigen Funktion, es könnte bewertet werden, als ob es sich um eine voll auf Funktionsliteral
//Lets just assume that IE does not exist mmkay?
var funcs = ['map', 'filter', 'every', 'some'];
for (var i=0; i<funcs.length; i++) {
(function() {
//Store original function
var name = funcs[i]
var _super = Array.prototype[name];
Array.prototype[name] = function() {
//$ !== jQuery
if (typeof arguments[0] == 'string') arguments[0] = $(arguments[0]);
return _super.apply(this, arguments);
};
}());
}
Nun waren Sie
[1,2,3,4,5].map('a*a');
statt
schreiben
[1,2,3,4,5].map(function(a){return a*a;});
, die sogar besser als Firefox Expression Closure
[1,2,3,4,5].map(function(a) a*a);
Probieren Sie es hier aus: http://jsbin.com/iyogu3/edit
Wenn wir nur könnten tatsächlich Funktion Ausdrücke wie dies ohne Aufforderung an die eval Monster schreiben. Wirklich, eine meiner Hauptkritiken mit Javascript-Syntax ist die Anforderung, function(){}
in Ihrem gesamten Code zu spammen. Eine Art von Kurzschreibfunktions-Literalsyntax (nicht die oben erwähnte halb-assed-Ausdrucksschließung), die genauso interpretiert wurde wie ein normales ausführliches Funktionsliteral, würde einen langen Weg dahin führen, meinen Code etwas weniger lächerlich zu machen. Und es könnte auch helfen, ein winziges Bit zu verkleinern.
Was Ausführungszeit? Alles, was eine zusätzliche Interpretation beinhaltet (wie Ihr Beispiel, da Ihre Funktion eine Zeichenkette ist), wird wahrscheinlich eine Menge Zeit benötigen. So sehr, dass Sie den Gewinn in der Download-Zeit ruinieren (was wahrscheinlich ein paar bis zu einigen Dutzend Millisekunden ist). – MvanGeest
Wie gesagt "über den Verstand hinaus". Es geht mehr darum, die Charaktere zu minimieren, als zu versuchen, einen echten Nutzen daraus zu ziehen. – Egon
@egon: Was möchten Sie minimieren, die 'a = $ (" a, b, c "," R = a + b + c ")' Teil oder die '$ = Funktion (a, b) {return neue Funktion (a, "R = 0;" + b + "; Rückgabe R")} 'Teil oder die Summe? – kennytm