2010-08-07 9 views
5

Was ist der kürzeste Weg (Zeichen) zum Erstellen einer "neuen Funktion" Alias.Kürzeste Möglichkeit zum Erstellen eines Alias ​​"neue Funktion" in JavaScript

Grundsätzlich ist dies für Code Golf und Minification Code über den Grund hinaus. Also, wenn Sie in der Regel würde schreiben:

a=function(a,b,c){return a+b+c;} 

Man könnte so etwas wie (auch wir abstrakte Schlüsselwort return auch mit globalen Variablen R) schreiben:

a=$("a,b,c","R=a+b+c") 
a=$(a,b,c){R=a+b+c} 

(nicht sicher, ob der zweite ist möglich .) Für das erste Beispiel

das beste, was ich mit ist habe kommen:

$=function(a,b){return new Function(a,"R=0;"+b+";return R")} 

Wichtig sind sowohl die Größen (Nutzung, Deklaration) als auch die Nutzungsgröße.

+0

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

+0

Wie gesagt "über den Verstand hinaus". Es geht mehr darum, die Charaktere zu minimieren, als zu versuchen, einen echten Nutzen daraus zu ziehen. – Egon

+0

@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

Antwort

18

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.

+0

+1 für "Lambada-Ausdrücke". (Eins zwei drei, hey!) –

1

Für einfache Ausdrücke, könnten Sie verwenden:

function L(a,x){return new Function(a,'return '+x)} 

Verbrauch:

n=L('a,b,c','a+b+c'); 
0

Hier ist eine Variante, die einen größeren Overhead spart aber ein Zeichen pro Funktionsdefinition. "@" wird durch "return" ersetzt.

$=function(a,b){return new Function(a,b.replace(/@/g,"return "))} 
a=$("a,b,c","@a+b+c") 
0

Sie könnten milage aus etwas albern wie bekommen:

eval("t=Fa+b};t(1,2)".replace("F", "function(a,b){return ")) 
0

Ihr Code: a=function(a,b,c){return a+b+c;}

Verkürzte Code: a=(a,b,c)=>a+b+c

Die kürzeste Funktionsdeklaration möglich in js ist 4 Zeichen

Beispiel:_=>1