Объем цикла for в Javascript

Рассмотрим следующий код:

for (var x = 0; x < 10; x++) { /* do awesome stuff. 10 times! */ }

console.log(x);

x по-прежнему печатается в консоли.

Это дает мне предупреждения в JSHint, потому что через пару строк я делаю еще один цикл, переопределяя x:

for (var x = 0; x < 10; x++) { /* more awesome stuff */ }

Теперь я знаю, что JSHint — это не святой Грааль, но есть ли способ предотвратить утечку x? (при условии, что это правильная терминология?

Я старался:

(function () {
    "use strict";

    for (var x = 0; x < 10; x++) { /* do awesome stuff. 10 times! */ }

    console.log(x);

    for (var x /* warning here */ = 0; x < 10; x++) { /* more awesome stuff */ }
})();

Так что "use strict"; это не выход.

Я попытался изучить его еще глубже (и это меня смущает не меньше, чем тошнит):

(function () {
    "use strict";

    {
        for (var x = 0; x < 10; x++) { /* do awesome stuff. 10 times! */ }
    }

    console.log(x); // STILL WORKS...

    for (var x /* warning here */ = 0; x < 10; x++) { /* more awesome stuff */ }
})();

И еще хуже:

В строке с вызовом console.log JSHint предупреждает меня о том, что x используется вне области видимости, И в следующей строке я повторно объявляю x.


person Snake    schedule 15.05.2014    source источник
comment
javascript не имеет области действия блока, это область действия функции. Любую переменную, объявленную в функции, можно увидеть в любом месте этой функции.   -  person Matt R    schedule 15.05.2014
comment
Я видел, как let используется в цикле for вместо var. Но, честно говоря, я бы проигнорировал JSHint.   -  person bozdoz    schedule 15.05.2014
comment
Все объявления var в функции обрабатываются так, как будто они произошли в начале функции. Там нет области видимости, но область действия функции. @bozdoz let — это функция JavaScript версии 6, которая не поддерживается повсеместно.   -  person Pointy    schedule 15.05.2014
comment
См. Поднятие переменных   -  person Juan Mendes    schedule 15.05.2014


Ответы (1)


Переменные только ограничены функциями в JavaScript, а не блоками. Если вам абсолютно необходимо охватить каждый цикл for отдельно, вам нужно будет сделать что-то вроде этого:

(function () {
    for (var x = 0; x < 10; x++) { /* do awesome stuff. 10 times! */ }
})();
(function () {
    for (var x = 0; x < 10; x++) { /* more awesome stuff */ }
})();

Или вы можете просто повторно использовать переменную x без ее повторного объявления, что все равно будет работать нормально.

person Alexis King    schedule 15.05.2014
comment
Обычно считается хорошей практикой объявлять все ваши переменные заранее, в данном случае только var x; в начале функции. Таким образом, вам не нужно отслеживать встроенные var. - person Niet the Dark Absol; 15.05.2014
comment
@NiettheDarkAbsol, я считаю это полезным для решения вопроса о том, нуждается ли моя функция в рефакторинге - слишком много переменных может означать, что некоторые функции могут быть перемещены в отдельную функцию. - person Andy; 15.05.2014