2012-04-23 12 views
56

Mögliche Duplizieren:
Javascript syntax: what comma means?return-Anweisung mit mehreren durch Komma getrennte Werte

Was dieses Muster zurückkommt? Wie funktioniert es?

return myfunc(), myobj.myvar = someobj.prop, myobj

Ich habe nicht über dieses Muster kommen vor, aber wurden bei der Bing Maps Ajax Control suchen und haben diese Muster mehrmals bemerkt.

Wie ich es verstehe, werden mehrere Werte nicht zurückgegeben. Was macht dieses Muster? Was wird zurückgegeben? Was nützt dieses Muster?

+0

Gibt es eine Reihe von Argumenten zurückgeben; Wie kann man die Parameter in einem Funktionsaufruf überladen? –

+1

"Was ist das Muster profitieren?" - Es hat keinen. Es ist verwirrender, nicht-idiomatischer Code. – Quentin

+0

Ich kann keinen Grund sehen ... Es legt sogar mehr Objekte auf den Stapel als wenn es drei normale Anweisungen gäbe ... –

Antwort

100

Es ist die comma operator. Es führt eine Reihe von Ausdrücken der Reihe nach aus und gibt dann das Ergebnis der letzten von ihnen zurück. Genau das mag:

myfunc(); 
myobj.myvar = someobj.prop; 
return myobj; 

Einige Leute wirklich lieber Dinge auf einer Linie zu tun, auch wenn es keinen objektiven Grund zu. Es gibt keinen Vorteil in dem Beispiel, das Sie gegeben haben, und tatsächlich ist es verwirrend, weil es so aussieht, als ob die ersten zwei Bits mit dem Wert zusammenhängen, der letztendlich zurückgegeben wird, was nicht der Fall ist.(ich schrieb, dass, bevor Sie uns gesagt, dass es Code minimiert wurde, natürlich, ist unklar ist für die Menschen nur ein Problem im Quellcode, minimierte Code nicht.)

Da Sie es ein minifier gesagt haben: Die sehr klein Der mögliche Vorteil, den der Minifier dort haben könnte, ist, wenn dies Teil eines bedingten Blocks ist: Er kann ein oder zwei Zeichen speichern. Wenn wir die lange Form sah wie folgt annehmen:

if (someCondition) { 
    myfunc(); 
    myobj.myvar = someobj.prop; 
    return myobj; 
} 

... mit dem Komma-Operator kann der minifier dies tut (63 Zeichen):

if(someCondition)return myfunc(),myobj.myvar=someobj.prop,myobj 

... eher als diese (65 Zeichen):

if(someCondition){myfunc();myobj.myvar=someobj.prop;return myobj} 

..., ohne die Funktionalität des Codes zu ändern, wenn was folgt ein } oder ein anderes geeignetes Zeichen (oder End-of (Datei), um am Ende automatic semicolon insertion auszulösen. Sonst würde es die ; auf der ersten benötigen, aber das spart immer noch ein Zeichen.

+11

+1 (Ich habe gerade eine neue Sache gelernt) – MilkyWayJoe

+3

Was noch schlimmer ist, dass Sie alles auf eine Zeile setzen können. Die Verwendung von '' '' anstelle von '' 'erlaubt es einfach, die' return'-Anweisung an die Front zu setzen, wo Betreuer verwirrt werden. – Quentin

+0

@Quentin: Ganz. –

8

Die comma operator wertet (von links nach rechts) die Ausdrücke aus und gibt dann das letzte Ergebnis zurück, das in diesem Fall die Auswertung des myobj Bezeichners ist.

Sie tun können, das einige geschweiften Klammern zu beseitigen, wenn das für Sie wichtig ist ...

if (true) 
    ;// do something 
else 
    return myfunc(), myobj.myvar = someobj.prop, myobj 

... im Gegensatz zu ...

if (true) 
    ;// do something 
else { 
    myfunc(); 
    myobj.myvar = someobj.prop; 
    return myobj; 
} 
1

in Ihrem Beispiel sollte myobj zurückgegeben werden, wo, wie alles, was vor

ausgeführt wird
myfunc(); 
myobj.myvar = someobj.prop; 
return myobj; 
Verwandte Themen