Необходимо ли предупреждение JSLint «повторное объявление счетчика переменных»?

#javascript #jslint

#javascript #jslint

Вопрос:

У меня есть скрипт длиной в несколько строк, и у меня есть много типов флагов, таких как so

 var counter = 0;
var carFlags = {
 Audio : counter   ,
 Bentley : counter   ,
 Chrysler : counter  
 Datsun : counter   
 ...
};
  

позже, если я создам новый объект флага таким же образом

 var counter = 0;
var nameFlags = {
 Ashley : counter   ,
 Bronwyn : counter   ,
 Catherine : counter  
 DakotaFanning : counter   
 ...
};
  

Он жалуется, что счетчик используется как часть большего оператора, но я думаю, что здесь это вполне приемлемо. Тем не менее, я дважды использовал counter здесь, поэтому он предупреждает redeclaration of var counter . Я мог бы перейти var counter к началу страницы, но это может сделать менее понятным, для чего counter используется. Есть ли какие-либо реальные проблемы с использованием var более одного раза? У меня было delete counter заявление, но оно ничего не сделало. Должен ли я изменить его на delete window.counter ?

Ответ №1:

Я не совсем уверен в вашей области видимости здесь, но если это глобальная область, то delete counter действительно ничего не сделает. Также нет необходимости в delete window.counter том, что в любом случае будет то же самое (если мы находимся в среде браузера в глобальной области видимости).

Если вы хотите повторно использовать переменную — достаточно простого присваивания:

 counter = 0
  

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

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

Редактировать:

конечно, возникает вопрос, почему вы используете одно и то же имя…

Ответ №2:

Нет, проблемы нет. Фактически, в Javascript объявления переменных (with var ) в любом случае автоматически поднимаются на вершину их охватывающей области. Например, следующее:

 var n = 5;
if (n < 3) {
   var q = 2;
   var n = 4;
}
  

эквивалентно:

 var q, n=5;
if (n < 3) {
   q = 2;
   n = 4;
}
  

Комментарии:

1. Таким образом, ветвь then оператора if не представляет собой область видимости переменной (как в C / C )?

2. @StefanMajewsky Правильно, переменные в JavaScript не ограничены блоками кода, такими как then-ветвь оператора if . Переменные JavaScript ограничены только функциями или глобальной областью.

Ответ №3:

Дайте им уникальные имена, и у вас не будет никаких проблем.

 var carCounter = 0;
var nameCounter = 0;
  

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

Комментарии:

1. хороший совет. Но что, если у вас есть два (неназначенных) цикла for, должны ли вы назвать один var i и другой var j ?