Pierwsza wersja:
for (var x in set) {
...
}
deklaruje lokalną zmienną o nazwie x
. Druga wersja:
for (x in set) {
...
}
nie.
Jeśli x
jest już zmienną lokalną (tj. Masz var x;
lub var x = ...;
gdzieś wcześniej w swoim obecnym zakresie (tj. Bieżącej funkcji)) to będą równoważne. Jeśli x
nie jest już zmienną lokalną, użycie drugiej spowoduje niejawne zadeklarowanie zmiennej globalnej x
. Rozważ ten kod:
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();
można się spodziewać to alert hey
, there
, heli
, hey
, there
, copter
, ale ponieważ x
jest jedno i to samo będzie ostrzegać hey
, there
, there
, hey
, there
, there
. Nie chcesz tego! Użyj var x
w swoich for
pętlach.
Na dodatek: jeśli for
pętla znajduje się w zasięgu globalnym (tj. Nie jest w funkcji), wówczas zasięg lokalny (zasięg x
jest zadeklarowany w przypadku użycia var x
) jest taki sam jak zasięg globalny (zakres x
jest niejawnie zadeklarowany w jeśli używasz x
bez var), więc obie wersje będą identyczne.
var
nie był używany do deklarowania iteratori
:Uncaught ReferenceError: i is not defined
. Więc od teraz będę go używać: / webpack dziwnie traktuje zmienne „globalne”, więcej patrz: stackoverflow.com/a/40416826