Какова область видимости переменной JavaScript в операторе switch / case? - PullRequest
10 голосов
/ 26 марта 2010

При создании JavaScript с ASP.NET MVC я заметил несколько предупреждений о области видимости и понял, что мне чего-то не хватает в понимании области видимости переменной внутри оператора switch / case.

Предупреждение: «i» уже определено в отношении случая b и случая c

Мой код выглядит примерно так:

switch(element) {
  case 'a':
   for(var i=0; i < count; i++){
    do something
   }
   break;

  case 'b':
   for(var i=0; i < count; i++){
    do something
   }
   break;

  case 'c':
   for(var i=0; i < count; i++){
    do something
   }
   break;
}

Я думал, что область действия заканчивается каждым оператором break, но кажется, что область действия не заканчивается до конца switch / case. Является ли область действия для всего коммутатора / корпуса?

Ответы [ 3 ]

15 голосов
/ 26 марта 2010

Javascript не использует область видимости блока.

Следовательно, все локальные переменные находятся в области видимости во всей функции, в которой они были объявлены.

Однако в вашем конкретном случае не существует C-подобного языка (о котором я знаю), в котором каждое утверждение case образует независимую область действия.
Например, следующий код C # не будет компилироваться:

switch(someVar) {
    case 1:
        int a;
        break;
    case 2:
        int a;        //'a' is already defined
        break;
}
4 голосов
/ 26 марта 2010

Является ли область применения всего переключателя / корпуса?

Нет, это для всей содержащей функции или глобальной области видимости, если вы находитесь вне функции.

(Есть несколько непонятных случаев, когда JavaScript вводит дополнительную область видимости, но это все.)

Предупреждение: «i» уже определено

Я не совсем согласен с тем, что это предупреждение. Я бы предпочел оставить код таким, какой он есть, с независимым использованием блоков переменной i.

Он хочет, чтобы вы удалили var из всех, кроме первого объявления, или, возможно, добавили var i перед переключателем и удалили var из всех for. Но теперь эти блоки не одиноки, и быстрое вырезание и вставка (скажем, для рефакторинга switch в отдельные function s) оставляет вам циклы, ссылающиеся на i, который не объявлено var. Это случайный глобальный объект, и это ужасная ловушка JS, от которой можно отладить настоящую боль.

JSLint подает ту же жалобу. Я бы обычно игнорировал это. Не вредно объявлять переменную var дважды в одном блоке.

0 голосов
/ 26 марта 2010

Даже если у javascript была область видимости блока, есть функция перехода, которая как бы лишает смысла наличие области действия для case ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...