2016-04-30 8 views
4

Ich lerne derzeit JavaScript auf Code Academy und ich bin am Ende der While-Schleifen-Abschnitt.Ich verstehe nicht ein einfaches JavaScript 'While-Schleife'

Der folgende Code:

j = 0; 
while (j < 3) { 
    j++; 
} 

erzeugt eine 2 auf der Konsole und ich habe keine Ahnung, warum. Ich habe versucht, diese auf EclipseJaveEE nur auszuführen, um zu erkennen, dass die Verwendung einer HTML-Datei mit diesem Code als ein Skript gibt mir ein anderes Ergebnis: eine leere Seite.

Das macht für mich Sinn, denn ich habe nur bis 3 inkrementiert, aber nicht gedruckt. Nicht sicher, warum die Codecademy Konsole gibt mir ein 2.

Dies ist ein Screenshot der Konsolenausgabe:

codeacademy console output

+0

Ist dies der vollständige Code? Du gibst 2 irgendwann zurück, daher erscheint es. Ihre while-Schleife enthält keine Konsolenanweisungen zum Drucken auf der Konsole. –

+1

wo ist console.log() -Anweisung in Code – virendrao

+0

Es ist nur eine Konsole, die den Wert des letzten Ausdrucks zurückgibt. Das Verhalten ist extrem schwierig, daher ist es besser, im Moment nicht daran zu denken. – zerkms

Antwort

6

Das Verhalten Sie beobachten ist, weil das ist, wie ein Browser-Konsole funktioniert.

Für jeden Code, den Sie auswerten, wird versucht, einen Wert zurückzugeben. Für triviale Ausdrücke ist es einfach - 2 + 2 würde vermutlich 4 zurückgeben.

Für Code, der aus mehreren Anweisungen besteht, ist es viel komplizierter und die Konsole versucht, intelligent zu sein. Was die Komplexität erhöht, ist die Tatsache, dass das Verhalten der Konsole nicht standardisiert ist. Das, was wir in diesem Moment für einen bestimmten Browser beobachten, kann nicht garantiert werden, dass es für einen anderen Browser oder für eine andere Version des gleichen gilt.

Lassen Sie uns versuchen, um herauszufinden, was passiert, wenn:

j = 0; 
while (j < 3) { 
    j++; 
} 

für diesen Code Browser intelligent zu sein versucht und gibt den Wert des letzten Ausdrucks gefunden, die in diesem Fall ist j++; ist. Es gibt 2 zurück, weil das der Wert von j auf der letzten Iteration vor Schleifenbeendigung war. Und da das Postfixinkrement den aktuellen Wert zurückgibt, bevor es geändert wird, gibt es 2 zurück.

Wenn wir es

j = 0; 
while (j < 3) { 
    ++j; 
} 

der Ausgang 3 für den gleichen Grund wäre ändern.

Jetzt versuchen wir etwas anderes:

j = 0; 
while (j < 3) { 
    j++; 
    a = 42; 
} 

dies würde die Ausgabe 42. Seit dem a = 42 ist der neueste Ausdruck in diesem Code.

j = 0; 
while (j < 3) { 
    j++; 
    var a = 42; 
} 

Für diese Probe würde es wieder 2 zurückkehren, da Konsole die Zuweisungsanweisung zu ignorieren entscheidet und auf den neuesten Ausdruck kehrt zurück.

Zusammenfassend: Dieses Verhalten ist nicht standardisiert, und Browser versuchen nur, nützlich zu sein und etwas auszugeben, auch wenn es nicht das ist, was Sie erwarten. Mein Rat wäre also, sich nicht auf die implizite Konsolenausgabe zu verlassen und die console.log() explizit zu verwenden, wenn Sie ein Ergebnis erhalten möchten.

+0

Die Konsole versucht nicht wirklich etwas schlau zu machen. Es gibt nur das Ergebnis des 'eval()', das ausgeführt wird. –

+0

@squint es ist nicht erforderlich, ein Ergebnis von 'eval()' zurückzugeben. Übrigens wäre es interessant, eine entsprechende Implementierung in Browsern zu sehen. – zerkms

+1

Ja, ich meinte nicht, dass sie dazu aufgefordert werden. Ich sage nur, dass sie das tun (wahrscheinlich sowieso) anstatt zu versuchen, clevere Analysetricks durchzuführen. Der Quellcode wäre interessant. –

Verwandte Themen