«Переменная» использовалась до того, как была определена - PullRequest
12 голосов
/ 10 февраля 2010

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

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

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

Как мне это преодолеть?

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

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

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

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

Ответы [ 6 ]

7 голосов
/ 10 февраля 2010

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

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

var aVariable = null;

... (чуть позже)

if (aVariable == null) {
  aVariable = value;
}
5 голосов
/ 11 февраля 2010

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

Раствор 1

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

Так что лучше было бы просто сделать это:

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

Не объявляя «var» и просто назначая foo, foo автоматически получит глобальный охват.

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

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

var foo = foo || "some value";
4 голосов
/ 10 февраля 2010

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

window.aVariable = 'default';

и позже

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

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

2 голосов
/ 10 февраля 2010

Попробуйте это:

aVariable = null;

aVariable = typeof(aVariable) == 'undefined' ? null : value;
1 голос
/ 10 февраля 2010

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

var aVariable;

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

if (typeof aVariable == "undefined") {
    aVariable = value;
}
0 голосов
/ 10 февраля 2010

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

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

...