2012-03-30 5 views
5

Was in der Welt macht den zweiten Parameter zurück true?Warum ist das für (;;) Schleifen?

ACHTUNG: es wird unendlich Schleife und könnte Ihr Browser

for(;;){ 
    //... 
} 

Absturz ich total erwartete gar nicht Schleife ...

Aber es läuft, und das macht es schlimmer, da es nur laufen kann, wenn etwas auf true ausgewertet wird, oder fehle ich etwas?

+3

Wenn überhaupt keine Bedingung angegeben ist, wird eine for-Schleife ausgeführt, bis Sie ausbrechen. Es ist das gleiche in C. –

+0

Siehe http://stackoverflow.com/questions/4894120/special-for-loop-syntax/4894256#4894256 - genauso in Java und JavaScript wie in C und C++. – paxdiablo

Antwort

7

Von forMDN

for ([initialization]; [condition]; [final-expression]) 
    statement 

[Initialization] und [final-expression] erforderlich sind intuitiv nicht, um das Konstrukt zu einer einfachen while Schleife zu reduzieren. Aber der relevante Teil ist:

Zustand
Ein Ausdruck vor jeder Schleife Iteration ausgewertet werden. Wenn dieser Ausdruck als wahr ausgewertet wird, wird die Anweisung ausgeführt. Dieser bedingte Test ist optional. Wenn sie weggelassen wird, wird die Bedingung immer als wahr ausgewertet. Wenn der Ausdruck als false ausgewertet wird, springt die Ausführung zum ersten Ausdruck, der dem for-Konstrukt folgt.

(Hervorhebung von mir)

Dies scheint eine völlig willkürliche JS Sprache Design-Entscheidung zu sein. Wenn es meine Sprache wäre, würde ich wahrscheinlich einen Syntaxfehler werfen.


auf spielerische Seite beachten ist for(;;){} entspricht while(true){} und passiert 4 Zeichen kürzer. Ich frage mich, ob Minifier das nutzen!

+0

gute Referenz, ich vertraue total auf jedes Wort dieser Seite – ajax333221

4

Weil das Fehlen einer Bedingung immer als wahr bewertet wird.

+0

Wirklich? Das ist eine Art Hokey. Funktioniert das überall in Java? Wie in 'if()'? –

+0

@RobertHarvey, die Syntax verhindert, dass 'if()' keine Bedingung hat, aber 'for()' nicht verhindert. – rid

1

Es gibt nichts, "wodurch der zweite Parameter true zurückgibt". Es gibt keinen zweiten Parameter. Abschnitt 12.6.3 der ECMAScript Language Specification (ECMA-262 5th Edition) sagt dies:

a. Wenn der erste Ausdruck vorliegt, dann

i. Lassen Sie testExprRef das Ergebnis der Auswertung der ersten Ausdruck sein.

ii. Wenn GetValue (testExprRef) ist falsch, return (normal, V, empty).

Die „erste Expression“, um es mit Bezug ist, ist der optionale Ausdruck zwischen den Semikolons der for Aussage. Wenn es vorhanden ist, führt das Programm die oben genannten Schritte (i) und (ii) aus. Wenn der Ausdruck nicht vorhanden ist, führt das Programm einfach die Schritte (i) und (ii) des for Anweisungsalgorithmus nicht aus.