При создании 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;
}
Я думал объем, законченный каждым оператором завершения, но кажется, что объем не заканчивается до конца переключателя/случая. Является объемом для целостного коммутатора / случай?
Javascript не использует область блока.
Следовательно, все локальные переменные находятся в области видимости всей функции, в которой они были объявлены.
Однако в вашем конкретном случае не существует C-подобного языка (о котором я знаю), в котором каждый оператор case
образует независимую область видимости.
Например, следующий код C # не будет компилироваться:
switch(someVar) {
case 1:
int a;
break;
case 2:
int a; //'a' is already defined
break;
}
Даже если javascript имеет область видимости блока, есть функция провала, которая как бы исключает понятие наличия области согласно case
...
Область действия распространяется на весь переключатель / регистр?
Нет, это на всю содержащую функцию или глобальную область, если вы находитесь вне функции.
(Есть несколько непонятных случаев, когда JavaScript вводит дополнительную область видимости, но это все.)
Предупреждение: 'i' уже определено
Я не совсем согласен с тем, что это предупреждение. Я бы предпочел оставить код как есть, с независимым использованием блоками переменной i
.
Он хочет, чтобы вы удалили var
из всех объявлений, кроме первого, или, возможно, добавьте var i
перед переключателем и удалите var
из все для
с. Но теперь эти блоки не автономны, и быстрое вырезание и вставка (например, рефакторинга переключателя
в отдельные функции
s) оставляет вас с циклами, ссылающимися на i
, который не был объявлен var
. Это случайная глобальная ошибка, и это ужасная ловушка JS, отлаживать которую может быть очень сложно.
JSLint высказывает ту же жалобу. Я обычно игнорирую это. Не повредит дважды объявить переменную var
в одном блоке.