2014-09-10 3 views
1

Comme nous le savons, javascript n'a pas BLOCK SCOPE, alors quand je l'ai écrit une boucle comme ci-dessous:Comment déclarer une variable curseur en javascript?

list = [1, 2, 3, 4]; 
// notice about the `var` keyword 
for(var i = 0; i < list.length; ++i) { 
    // Do something. 
} 
console.log(i); // shows 4 

La question est la suivante: dois-je utiliser var de déclarer la i variable?


SO SI:

Quand j'ai deux ou plusieurs consécutifs pour la boucle, je veux l'utiliser sera déclarer plus d'une fois le même curseur variables i,! Cela a simplement un problème!

for(var i = 0; i < list1.length; ++i) { 
    // do something. 
} 

for(var i = 0; i < list2.length; ++i) { 
    // do something. 
} 

// `i` was declared more than once! 

Sous cette forme, la variable du curseur i déclaré peut-être plus d'une fois, et le code lui-même implique que la variable i est susceptible d'avoir une portée à l'intérieur du bloc pour, mais pas en effet.


SINON SO:

Dois-je déclarer explicitement tous pour les curseurs plus tôt dans la fonction?

var i, j, k; // and maybe a long list that I didn't expected? 

// Maybe some other code. 

for(i = 0; i < count1; ++i) { 
    // do something 
} 

for(j = 0; j < count2; ++j) { 
    // do something 
} 

for(k = 0; k < count3; ++k) { 
    // do something 
} 

Si je code de cette façon, je pense que le code est terrible: il a une longue distance entre la déclaration et l'utilisation, et obscure de ce qu'ils sont lorsqu'ils sont déclarés.

Si j'omets les déclarations pour tous, et que j'utilise simplement, ces variables de curseur tombent dans globals! C'est beaucoup plus terrible!


Donc je demande une bonne pratique, comment déclarer la variable curseur dans ce cas?

Besoin de votre aide.

+0

Il y a une portée de bloc dans _some_ JavaScript: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let –

+1

@MattBall bien, mais il semblait pas largement pris en charge, j'ai échoué pour l'utiliser sous le débogueur chrome. –

+0

Les deux façons font la même chose, et les deux pratiques sont bien établies. – Bergi

Répondre

0

La déclaration d'une variable l'hisse en haut de la fonction et les déclarations successives sont syntaxiquement légales mais ignorées. Alors:

var i, j, k; // and maybe a long list that I didn't expected? 

// Maybe some other code. 

for(i = 0; i < count1; ++i) { 
// do something 
} 
... 

est ce que l'interprète fait sous le capot si vous déclarez qu'il plusieurs fois.

La déclaration de cette façon (variables en haut) est donc généralement ce que les gens suggèrent (et ce que suggère JSLint).

3

Généralement, il est plus simple de déclarer la variable, puis de l'utiliser dans plusieurs boucles non imbriquées.

var i; 

for(i = 0; i < list1.length; i++) { 
    // do something. 
} 

for(i = 0; i < list2.length; i++) { 
    // do something. 
} 

Il n'y a pas de problème avec la réutilisation i dans plusieurs boucles. Dès que la deuxième boucle commence, la valeur est définie sur la valeur initiale et tout va bien.

+1

Je ne pense pas que le problème causé par "++ i" existe, ce n'est pas la condition de la boucle. @Alex Wayne –

+1

Il n'y a pas de différence entre l'utilisation de '++ i' et' i ++' dans la partie mise à jour de la boucle. Le résultat de l'expression n'est pas utilisé dans la condition. – Bergi

+0

Vous avez raison, mon mauvais! –

Questions connexes