2012-10-26 3 views
19

Ich war auf der Suche am Ausgang von einem paar Sachen aus UglifyJS und über einige Codes wie folgt geschehen:Warum funktioniert dieses JavaScript?

var a = 0; 
var b = function() { 
    return function() { 
     a++; 
    }(), 'Hello, World' 
}(); 

Nach diesem Code ausgeführt a ist 1 und b ist die Zeichenfolge Hello, World!.

Auf den ersten Blick scheint bundefined zu sein, da es aussieht, als ob das Ergebnis einer Funktion ohne Rückgabewert zurückgegeben wird, aber gefolgt von einem Komma und einem String-Literal.

Warum funktioniert das?
Und warum führt UglifyJS nicht einfach die anonyme Funktion aus und gibt dann Hello, World! als nächste Anweisung zurück?

+5

Eine bessere Frage könnte sein, warum Sie (oder wer) Javascript auf diese Weise schreiben? Code sollte eindeutig sein. –

+5

@CoreyOgburn es ist nicht mehrdeutig, wenn Sie wissen, was der Komma-Operator tut. – AD7six

+0

'var a = (" rofl "," aber sein lol! ");' – jAndy

Antwort

25

Es funktioniert aufgrund der Komma-Operator. Aus den MDN-Spezifikationen:

Der Kommaoperator wertet beide Operanden (von links nach rechts) aus und gibt den Wert des zweiten Operanden zurück.

Beide Funktionen sind IFFYs, sie werden sofort ausgeführt.

+1

Was sind IFFIs? – j08691

+4

@ j08691: Ich denke, er meint "IIFE" oder "sofort aufgerufene Funktion Ausdruck". Das ist, wenn Sie eine Funktion machen und sie sofort aufrufen, wie 'function() {}()'. Nicht alle * Funktionen sind jedoch "IIFE" s. –

+3

@Rocket, ich denke, Wouter bedeutet * beide * Funktionen auf dem Beispiel-Code sind IIFEs. – bfavaretto

6

Das Ergebnis eines Ausdrucks, der the comma operator verwendet, ist die rechte Seite des Kommaoperators.

Sie haben:

return a_function_call(), a_string 

... so erhalten Sie a_string zugeordnet.

4

Zunächst einmal lassen Sie mich MDN on the comma operator zitieren:

Der Komma-Operator seiner beiden Operanden ausgewertet (von links nach rechts) und gibt den Wert des zweiten Operanden.

Mit diesem wird gesagt, ist es klar ist, wie Ihr Code auswertet:

Innerhalb der sofort ausgeführt Funktion, die Sie durch ein Komma getrennt 2 Werte zurück:

function() { a++; }() 

und

'Hello World' 

Also beide Operanden ausgewertet werden. Dies erhöht Ihre Variable a und führt zu folgendem Ausdruck für den Rückgabewert der Funktion b zu erstellen:

undefined, 'Hello World' 

Schließlich wird der rechte Operand als Wert für die äußeree Funktion zurückgegeben wird, so b den Wert 'Hello World' geben.

+0

Würde 'a ++, 'Hallo Welt' nicht zurückgeben? Ich glaube nicht, dass die 'function()' notwendig ist. –

+1

@RocketHazmat Sicher ist es hier nicht notwendig, aber es ist in OP-Code vorhanden. – Sirko

0

Überprüfen Sie die comma operator in JavaScript.

Der Kommaoperator wertet beide Operanden (von links nach rechts) aus und gibt den Wert des zweiten Operanden zurück.