Область видимости переменной в Javascript для цикла - PullRequest
22 голосов
/ 26 апреля 2009

Какая разница между:

function bar()
{
  for (x=0; x< 100; x++) {}
}

И

function bar()
{
  var x;
  for (x=0; x< 100; x++) {}
}

Если x не был объявлен вне этой функции, и поэтому он не был глобальной переменной? Мне всегда интересно это, потому что я обычно не объявляю одноразовые переменные, которые используются только в цикле, но мне интересно, может ли это нарушить сопоставимость в браузере или тому подобное.

Ответы [ 3 ]

34 голосов
/ 26 апреля 2009

В первом примере будет добавлена ​​или изменена глобальная переменная x, чего, как правило, следует избегать, если не желаемого результата.

Хотя ваш второй пример работает как надо (без побочных эффектов), альтернатива, которая на мой взгляд выглядит лучше, будет

function bar()
{
  for (var x=0; x< 100; x++) {}
}
16 голосов
/ 26 апреля 2009

Переменная создается во время ее объявления / использования. Если вы опустите ключевое слово var, переменная будет создана автоматически в глобальной области видимости. Таким образом, вы производите побочный эффект. Этого, как правило, следует избегать.

Предположим, вы используете глобальные переменные, а затем выбрали имя переменной, которую уже занял какой-то другой фрагмент программного обеспечения. Это приведет к ситуации, когда куски кода перезаписывают свои значения. Это приводит к ошибкам и большую часть времени трудно отладить. В вашем примере вы можете перезаписать глобальную переменную x, которую использует другое программное обеспечение.

Использование var также быстрее. Если вы обращаетесь к глобальной переменной, она должна сканировать все области, вплоть до глобальной, на предмет имени переменной. Используя var, он привязан к вашей локальной области видимости.

Рекомендуется всегда использовать var. Или лучше: всегда хорошо выбрать наиболее узкую область видимости для ваших переменных. Теперь у вас есть глобальный и вар. Объявление var видно во всей функции независимо от того, где вы ее объявили. В JavaScript 1.7 введено новое ключевое слово: let. Пусть сужает рамки еще больше. Если вы объявляете цикл for с

for(let x = 0; x < 100; i++) {}

чем x виден только внутри блока {}.

2 голосов
/ 01 мая 2014

Всегда помните, в JavaScript области видимости определяются функциями. В примере

function () {
    var x = 15;
    bar();
    function bar() {
      for (x=0; x< 100; x++) {}
    }
    //here x will be 100
}

Вы можете случайно получить доступ к более высокому объему. Что я имею в виду под более широкой областью действия - это функция-оболочка или window.x (если больше нет функции-оболочки) Намного лучше придерживаться второго примера, если вы просто хотите использовать x для цикла.

function () {
    var x = 15;
    bar();
    function bar() {
        var x;
        for (x=0; x< 100; x++) {}
    }
    //here x will be 15
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...