Первая версия:
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), поэтому две версии будут идентичными.
person
Claudiu
schedule
19.04.2011
var
не использовался для объявления итератораi
:Uncaught ReferenceError: i is not defined
. Поэтому я буду использовать его с этого момента:/ webpack странно обрабатывает глобальные переменные, подробнее см.: stackoverflow.com/a/40416826 - person user1063287   schedule 24.05.2018