2009-11-10 5 views
18

Essentiellement, je suis en train de déclarer une variable dans l'état-partie d'une boucle while en javascript:déclaration de variable dans tout état dans javascript

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

Pourtant, mon navigateur (Firefox) ne accepte cela. Au lieu de cela, je dois aller comme ça:

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

qui fonctionne. Ce comportement est-il attendu?

+1

Les 2 ci-dessous expliquent le levage de déclarations de variables mais n'expliquent pas pourquoi vous ne pouvez pas déclarer une variable dans une condition 'while' (mais vous pouvez, par exemple, dans une condition' for'). Avez-vous déjà trouvé une bonne explication à cela? – Barney

+2

Une autre bizarrerie de JS, c'est pourquoi. –

Répondre

16

JavaScript n'a pas de portée de bloc. Il a une portée de fonction. Donc, pour vous assurer que les humains et JavaScript lisent le code de la même manière, vous devez manuellement lever vos déclarations var jusqu'au sommet des fonctions.

Voici ce que dit JSLint au sujet de votre code:

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

Utilisez JSLint, au moins pendant que vous êtes en apprendre JavaScript. Vous apprendrez beaucoup très rapidement. Cela nuira à vos sentiments.

+0

Ce n'est plus le cas avec let – Ced

23

Oui, c'est.

Si vous le souhaitez, vous pouvez utiliser une boucle for, comme ceci:

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

JavaScript n'a pas la portée du bloc. Donc toutes les déclarations var sont à la portée de la fonction. Ainsi, déclarer une variable dans une expression while n'a pas de sens dans JavaScript.

En outre, vous devez terminer vos instructions par un point-virgule. Ce n'est pas strictement nécessaire, mais c'est fortement recommandé.

16

La question est un peu datée, mais je pense que les réponses manquent toutes une distinction importante. C'est-à-dire qu'une boucle while attend une expression qui s'évalue à un conditionnel, c'est-à-dire un booléen ou une valeur qui peut être convertie en un booléen. Voir Mozilla docs pour plus de détails.

Une affectation pure (sans instanciation) est contrainte à un booléen via sa valeur de retour par défaut (la valeur du côté droit).

A var (ou let ou const) est une déclaration qui permet une affectation facultative, mais a une valeur de retour de undefined.

Vous pouvez facilement tester dans votre console:

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

Les depuis undefined est Falsey, les valeurs de retour seul ne répond pas à la question, mais montre que, même si JS vous permettent de mettre un var dans un conditionnel il évaluerait simplement toujours à faux.

D'autres ont mentionné for instructions et qu'elles permettent la déclaration et l'instanciation de variables. C'est vrai, mais le documentation explains que for attend une déclaration ou un assigment.

Les opinions peuvent varier, mais pour moi, tout cela équivaut à une cohérence compréhensible et non à un comportement bizarre en ce qui concerne les boucles.Une boucle while est mieux considérée comme une version en boucle d'une instruction if que comme une boucle for. S'il y a de la bizarrerie dans tout cela, c'est la divergence globale de l'instruction for par rapport à la syntaxe normale de la langue.

+2

Je cherchais 'why?' javascript ne permet pas const, laissez, var à l'intérieur alors que conditionnelles et cela a répondu à ma question. J'ai toujours trouvé confus que la console rapportée indéfini quand j'ai créé une nouvelle variable, plutôt que la valeur de la variable. Je ne vois toujours pas le point de retour javascript undefined; ils peuvent tout aussi bien renvoyer la valeur de la variable, mais si elle retourne indéfinie, de meilleurs navigateurs et erreurs de compilateurs sont utilisés dans les conditions. –

Questions connexes