Первая версия:
for (var x in set) {
...
}
объявляет локальную переменную с именем x
. Вторая версия:
for (x in set) {
...
}
не.
Если x
это уже локальная переменная (т.е. у вас есть var x;
или var x = ...;
где-то раньше в вашей текущей области (т.е. текущая функция)), они будут эквивалентны. Если x
это еще не локальная переменная, то использование второй неявно объявляет глобальную переменную x
. Рассмотрим этот код:
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();
Вы могли бы ожидать , что это предупреждение hey
, there
, heli
, hey
, there
, copter
, но так как x
это один и тот же она будет предупреждать hey
, there
, there
, hey
, there
, there
. Вы этого не хотите! Используйте var x
в for
петлях.
В довершение ко всему: если for
цикл находится в глобальной области видимости (т.е. не в функции), то локальная область видимости (при использовании x
объявляется область видимости var x
) такая же, как и глобальная область видимости (область x
неявно объявляется в если вы используете x
без var), поэтому две версии будут идентичны.
var
не использовалась , чтобы объявить итераторi
:Uncaught ReferenceError: i is not defined
. Так что с этого момента я буду использовать его: / webpack странно обрабатывает «глобальные» переменные, подробнее см .: stackoverflow.com/a/40416826