Подтвердить что ты не робот

В чем причина того, что JSLint говорит, что существует "слишком много операторов var",

JSLint (с включенным флагом onevar) помещает некоторый код javascript, который у меня есть со следующим:

Problem at line 5 character 15: Too many var statements.

Я рад исправить эти ошибки, но я хотел бы знать, делаю ли я это для производительности или потому, что это просто плохая практика и имеет больший потенциал для введения ошибок в код javascript. В чем причина флага onevar?

Я просмотрел документы JSLint для ключевое слово var, но в нем конкретно не говорится о том, почему несколько операторов var в одной и той же функции плохой.

Вот пример примера. Объясните, как код будет полезен только при наличии 1 инструкции var:

function Test(arg) {
   var x = arg + 1,
       y = cache.GetItem('xyz');
   if (y !== null) {
      // This is what would cause the warning in JSLint
      var request = ajaxPost(/* Parameters here */);

   }
}
4b9b3361

Ответ 1

Javascript не имеет области блока. На других языках с ним (например, c), если вы объявляете переменную в выражении if, вы не можете получить к ней доступ за ее пределами, но в javascript вы можете. Автор JSLint считает, что это плохая практика, так как вы (или другие читатели) можете запутаться и подумать, что больше не можете обращаться к переменной, но на самом деле можете. Поэтому вы должны объявить все свои переменные в верхней части функции.

Ответ 2

Официальная причина здесь, Дуглас Крокфорд.

Цитата:

Во многих языках блок вводит область видимости. Переменные, введенные в блок не отображается за пределами блока.

В JavaScript блоки не вводят область. Здесь есть только Функция-сфера. Переменная, введенная где угодно в функции, является видимый всюду в функции. Блоки JavaScript блокируют опытные программисты и приводят к ошибкам, потому что знакомый синтаксис делает ложное обещание.

JSLint ожидает блоки с функцией, if, switch, while, for, do и попробуйте утверждения и нигде больше.

В языках с областью блока обычно рекомендуется, чтобы переменные объявляются на месте первого использования. Но поскольку JavaScript не имеет области блока, разумнее объявить все функции переменные в верхней части функции. Рекомендуется, чтобы один var для каждой функции. Это может быть отклонено с помощью vars вариант.

Ответ 3

Просто объявляйте свои вары в одном месте:

var request,x,y;

Ответ 4

Если для параметра "onevar" установлено значение true, если разрешен только один оператор var для каждой функции.

if (funct['(onevar)'] && option.onevar) {
    warning("Too many var statements.");
}

Ответ 5

Обоснование уже описано.

Рекомендация заключается в использовании этой формы:

var myVar1 = document.getElementById("myDiv1"),
  myVar2 = document.getElementById("myDiv2");

или это:

var myVar1, myVar2;
myVar1 = document.getElementById("myDiv1");
myVar2 = document.getElementById("myDiv2");

Но это выглядит не очень хорошо, особенно если вы хотите документировать vars.

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

  /*jslint vars: true*/
  /**
   * @returns {HTMLDivElement}
   */
  var myVar1 = document.getElementById("myDiv1");
  /**
   * @returns {HTMLDivElement}
   */
  var myVar2 = document.getElementById("myDiv2");
  /*jslint vars: false*/

Предупреждение: убедитесь, что это выполняется в верхней части функции.

Я думаю, что это сделано, потому что jslint не может надежно определить, были ли vars объявлены в верхней части функции или нет.

Ответ 6

Только предположение, но может быть время для функциональной декомпозиции. Функции должны делать одно и делать это хорошо.

Слишком много vars указывает на функцию, которая пытается сделать слишком много. Или случай, когда вы должны использовать массив.

Ответ 7

Идея состоит в том, что вы должны использовать объект вместо отдельных vars. Итак, где у вас есть:

var x = arg + 1,
    y = cache.GetItem('xyz');

Измените его на:

var dimensions = {};
dimensions.x = arg + 1;
dimensons.y = cache.GetItem('xyz');
dimensions.request = ...

Затем вы можете получить доступ к этим переменным через объект, его опережающий, чтобы один объект на каждую функцию содержал эти переменные функций. Тогда вы не получите предупреждение.