Каков объем переменной JavaScript в переключателе / оператор выбора?

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

Предупреждение: 'я' уже определяюсь, относясь для преобразования регистра 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;
}

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

10
задан Cœur 26 July 2017 в 14:25
поделиться

3 ответа

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

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

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

switch(someVar) {
    case 1:
        int a;
        break;
    case 2:
        int a;        //'a' is already defined
        break;
}
15
ответ дан 3 December 2019 в 20:03
поделиться

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

0
ответ дан 3 December 2019 в 20:03
поделиться

Область действия распространяется на весь переключатель / регистр?

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

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

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

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

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

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

4
ответ дан 3 December 2019 в 20:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: