107 votes

"var" ou pas "var" dans du JavaScript dans la boucle?

Quelle est la façon correcte de faire un pour en boucle en JavaScript? Le navigateur ne peut pas se plaindre de chaque approche. Il y a ce qui, en fait, déclare x:

for (var x in set) {
    ...
}

Et ce, qui se lit plus naturel, mais ne semble pas correct:

for (x in set) {
    ...
}

111voto

Gabriel Llamas Points 5808

Utiliser var, il réduit la portée de la variable sinon, la variable prend la plus proche de la fermeture à la recherche d'un var déclaration. Si il ne trouve pas d' var alors qu'il est global (si vous êtes en mode strict, using strict, les variables globales de jeter une erreur). Cela peut conduire à des problèmes tels que les suivants.

function f (){
    for (i=0; i<5; i++);
}
var i = 2;
f ();
alert (i); //i == 5. i should be 2

Si vous écrivez var i dans la boucle de l'alerte montre 2.

JavaScript délimitation de l'étendue et de Levage

41voto

Claudiu Points 58398

La première version:

for (var x in set) {
    ...
}

déclare une variable locale appelée x. La deuxième version:

for (x in set) {
    ...
}

ne fait pas.

Si x est déjà une variable locale (c'est à dire que vous avez un var x; ou var x = ...; quelque part plus tôt dans votre périmètre en cours (c'est à dire la fonction en cours)), puis ils seront équivalents. Si x n'est pas déjà une variable locale, puis à l'aide de la deuxième implicitement déclarer une variable globale x. Considérer ce code:

var obj1 = {hey: 10, there: 15};
var obj2 = {heli: 99, copter: 10};
function loop1() {
    for (x in obj1) alert(x);
}
function loop2() {
    for (x in obj2) {
        loop1(); 
        alert(x);
    }
}
loop2();

vous pourriez vous attendre à ce à alerter hey, there, heli, hey, there, copter, mais depuis l' x est un et le même, il vous alerte en hey, there, there, hey, there, there. Vous ne voulez pas que! Utiliser var x votre for boucles.

Pour couronner le tout: si l' for boucle est dans la portée globale (c'est à dire pas une fonction), puis les locaux de la portée (scope x est déclaré dans si vous utilisez var x) est la même que la portée globale (le champ x est implicitement déclarée dans si vous utilisez x sans var), de sorte que les deux versions seront identiques.

26voto

Pointy Points 172438

Vraiment, vous devez déclarer les variables locales avec var, toujours.

Aussi vous ne devriez pas utiliser "pour les ... dans les" boucles sauf si vous êtes absolument sûr que c'est ce que vous voulez faire. Pour parcourir en véritables tableaux (ce qui est assez commun), vous devez toujours utiliser une boucle avec un index numérique:

for (var i = 0; i < array.length; ++i) {
  var element = array[i];
  // ...
}

Une itération à travers un simple tableau avec des " ... " peut avoir des conséquences inattendues, parce que votre boucle peut ramasser les attributs de la table en plus de la indexé numériquement.

12voto

user422039 Points 622

En fait, si vous n'aimez pas la déclaration dans for - tête, vous pouvez faire:

var x;
for (x in set) {
    ...
}

Comme mentionné ci-dessus à plusieurs reprises, de ne pas utiliser var à tous les produit les effets secondaires inutiles comme l'attribution d'une propriété globale.

9voto

Joel Coehoorn Points 190579

Utilisez celui où vous déclarez la variable de boucle avec var. Implicitement déclaré les variables ont une portée différente ce n'est probablement pas ce que vous souhaitiez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X