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 une variable var x;
ou var x = ...;
quelque part plus tôt dans votre portée actuelle (c'est-à-dire la fonction actuelle)) alors elles seront équivalentes. Si ce x
n'est pas déjà une variable locale, l'utilisation de la seconde déclarera implicitement une variable globale x
. Considérez 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 pouvez vous attendre à ce alerte hey
, there
, heli
, hey
, there
, copter
, mais puisque le x
est une seule et même il alertera hey
, there
, there
, hey
, there
, there
. Tu ne veux pas ça! Utilisez var x
dans vos for
boucles.
Pour couronner le tout: si la for
boucle est dans la portée globale (c'est-à-dire pas dans une fonction), la portée locale (la portée x
est déclarée dans si vous utilisez var x
) est la même que la portée globale (la portée x
est implicitement déclarée dans si vous utilisez x
sans var), les deux versions seront donc identiques.
var
n'a pas été utilisé pour déclarer la iteratori
:Uncaught ReferenceError: i is not defined
. Je vais donc l'utiliser à partir de maintenant: / webpack traite les variables "globales" bizarrement, pour en savoir plus, voir: stackoverflow.com/a/40416826