'Переменная' использовалась, прежде чем она была определена

Я проверяю, определяется ли переменная или нет, и если она не определяется явно, я собираюсь определить ее путем выполнения:

if ( typeof(aVariable) == 'undefined' ) {
  var aVariable = value;
}

Поскольку переменная не определяется, JSLint предупреждает, что это используется, прежде чем это будет определено, и это точно, что я хочу.

Как я могу преодолеть это?

Я хочу позволить определить те переменные, явно делающие это:

<script>
  var aVariable = value;
</script>
<script src="myScript.js"></script>

Таким образом, все, кто собирается включать этот сценарий, могут настроить некоторые свойства. И я боюсь, что не могу изменить эту логику, потому что она уже используется на сотне веб-сайтов этот путь.

Прокрутите вниз для ответов/решений, потому что я ответил, что мое собственное Переполнение стека вопроса не разоблачает его. Обязательно не пропустите их.

12
задан nimcap 2 January 2016 в 00:26
поделиться

6 ответов

Я нашел более приемлемые ответы в списке рассылки JSLint, извините за это Boldewyn :)

Решение 1

В IE, на уровне скрипта (т.е. на файл или блок скрипта), если он видит объявление "var" во время фазы разбора (перед выполнением), он сбросит значение этой переменной, если она уже существовала.

Поэтому лучше просто сделать так:

/*global foo: true */
if (typeof foo === "undefined") {
foo = "some value";
}

Не объявляя "var" и просто присваивая foo, foo автоматически получит глобальную область видимости.

Решение 2 (особый случай)

Если явно заданная переменная не равна нулю или false

var foo = foo || "some value";
5
ответ дан 2 December 2019 в 19:31
поделиться

Эта ошибка, похоже, возникает, когда вы используете верблюжий регистр для имени переменной. Если вы начнете переменную с заглавной буквы (переменная) или сделаете ее полностью строчной (переменная), вы просто получите «подразумеваемую глобальную» ошибку.

Я не уверен, что он пытается предложить, вводя регистр в имя вашей переменной, хотя вы всегда должны относиться к JSLint с недоверием. То, что вы здесь делаете, совершенно верно и является хорошей практикой, чтобы избежать случайного использования неопределенных переменных.

-1
ответ дан 2 December 2019 в 19:31
поделиться

Я думаю, что JSLint говорит вам, что вы не должны использовать переменные до того, как они определены. Если вы уверены, что это уместно в вашем сценарии - вы можете проигнорировать это предупреждение. Если вы не уверены, подумайте, почему эта переменная еще не определена.

Например, вы действительно хотите проверить, задано ли значение переменной, а не определена она или нет?

var aVariable = null;

... (как-нибудь потом)

if (aVariable == null) {
  aVariable = value;
}
7
ответ дан 2 December 2019 в 19:31
поделиться

Вы можете сделать переменную (в любом случае глобальную) явным членом окна :

window.aVariable = 'default';

и более поздние

if (! ('aVariable' in window)) {
    window.aVariable = 'new value';
}

Если вы не хотите или не можете изменять код, я бы предложил прагматический анзац и игнорировать жалобы JSLint, поскольку ваш код все равно будет работать (то есть до тех пор, пока поскольку вы не включаете строгий режим ECMAScript 5 ...).

4
ответ дан 2 December 2019 в 19:31
поделиться

Попробуйте так:

aVariable = null;

aVariable = typeof(aVariable) == 'undefined' ? null : value;
2
ответ дан 2 December 2019 в 19:31
поделиться

Проще всего объявлять свои переменные до того, как вы начнете их использовать:

var aVariable;

Это будет инициализировано типом "undefined", поэтому тест на undefined все равно будет работать:

if (typeof aVariable == "undefined") {
    aVariable = value;
}
1
ответ дан 2 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

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