2009-11-10 5 views
18

Im Grunde versuche ich, eine Variable in dem bedingungs Teil einer while-Schleife in Javascript zu deklarieren:Erklärung für die Variable in während Zustand in Javascript

while (var b=a.pop()) { 
    do_sth(b) 
} 

Doch mein Browser (Firefox) nicht akzeptiere das. Stattdessen muss ich so gehen:

var b 
while (b=a.pop()) { 
    do_sth(b) 
} 

was funktioniert. Wird dieses Verhalten erwartet?

+1

Die 2 unten erklären das Heben von Variablendeklarationen, erklären aber nicht, warum Sie keine Variable innerhalb einer 'while'-Bedingung deklarieren können (aber Sie können z. B. in einer' for'-Bedingung). Hast du jemals eine gute Erklärung dafür gefunden? – Barney

+2

Eine andere JS-Quirk, deshalb. –

Antwort

16

JavaScript hat keinen Blockbereich. Es hat Funktionsumfang. Um sicherzustellen, dass sowohl Menschen als auch JavaScript den Code auf die gleiche Weise lesen, sollten Sie Ihre var-Deklarationen manuell an den Anfang der Funktionen hissen.

Hier ist, was JSLint sagt über Ihren Code:

Problem at line 1 character 8: Expected an identifier and instead saw 'var'. 

Verwendung JSLint, zumindest während Sie JavaScript noch lernen. Du wirst sehr schnell viel lernen. Es wird deine Gefühle verletzen.

+0

Dies ist nicht mehr der Fall mit – Ced

23

Ja, ist es.

Wenn Sie möchten, können Sie eine for Schleife verwenden, wie folgt aus:

for (var b; b = a.pop();) {  //Note the final semicolon 
    do_sth(b); 
} 
6

JavaScript haben Block Umfang nicht. So sind alle var Deklarationen im Funktionsumfang. Die Deklaration einer Variablen in einem while Ausdruck ist daher in JavaScript nicht sinnvoll.

Zusätzlich sollten Sie Ihre Anweisungen mit einem Semikolon beenden. Es ist nicht unbedingt notwendig, aber es wird dringend empfohlen.

16

Die Frage ist ein wenig veraltet, aber ich denke, die Antworten alle verpassen eine wichtige Unterscheidung. Das heißt, eine while Schleife erwartet einen Ausdruck, der zu einem Konditional, d. H. Einem booleschen Wert oder einem Wert, der in einen booleschen Wert umgewandelt werden kann, auswertet. Einzelheiten finden Sie unter Mozilla docs.

Eine reine Zuweisung (ohne Instanziierung) wird über ihren Standard-Rückgabewert (den Wert der rechten Seite) in einen Booleschen Wert umgewandelt.

A var (oder let oder const) ist eine Anweisung die eine optionale Zuordnung ermöglicht aber einen Rückgabewert von undefined hat.

Sie können dies leicht in der Konsole testen:

var foo = 42; // undefined 
bar = 42  // 42 

Die Rückkehr allein Werte die Frage nicht beantworten, da undefined Falsey ist, aber zeigt, dass selbst wenn JS lassen Sie eine var in ein setzen bedingt würde es einfach immer zu falsch auswerten.

Andere haben for Anweisungen erwähnt und ermöglichen die Deklaration und Instanziierung von Variablen. Dies ist richtig, aber die documentation explains, dass for erwartet eine Aussage oder Zuordnung.

Meinungen können variieren, aber für mich ergibt das alles eine verständliche Konsistenz, keine Eigenart im Verhalten in Bezug auf Schleifen.Eine while Schleife ist besser als eine Looping-Version einer if-Anweisung gedacht als eine for Schleife. Wenn es in all dem Schrulligkeit gibt, ist es die Großhandelsabweichung der for Anweisung von der normalen Syntax der Sprache.

+2

Ich war auf der Suche nach "warum?" Javascript erlaubt nicht const, lassen Sie, var innerhalb während Bedingungen und das beantwortet meine Frage. Ich fand es immer verwirrend, dass die Konsole bei der Erstellung einer neuen Variablen und nicht als Wert der Variablen nicht definiert war. Ich sehe immer noch nicht den Punkt von Javascript zurück undefined; Sie können auch den Wert der Variablen zurückgeben, aber wenn sie undefiniert zurückkehrt, werden bessere Browser und Compiler Fehler, wenn sie in Bedingungen verwendet werden. –

Verwandte Themen