#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
?