JSLint жалуется на мою попытку / поймать - PullRequest
8 голосов
/ 17 ноября 2010

Javascript при запуске через JSLint кричит на меня, и я не уверен, почему.

/*jslint browser: true, devel: true, evil: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, newcap: true, immed: true */

var foo = function() {
  try {
    console.log('foo');
  } catch(e) {
    alert(e);
  }

  try {
    console.log('bar');
  } catch(e) {
    alert(e);
  }
};

foo();

Это говорит мне:

Проблема в строке 12, символ 11: 'e' уже определено.

} catch(e) {

Кажется, я расстроен, что у меня есть секунда catch(e). Почему это будет проблемой? Разве он не просто устанавливает e в локальную переменную внутри блока catch? Нужно ли однозначно называть локальные переменные для всех захваченных ошибок в функции?

Ответы [ 5 ]

9 голосов
/ 18 ноября 2010

Для JSLint try..catch имеет неявный эффект объявления e в качестве локальной переменной.Поскольку у вас есть два таких блока в одной и той же функции (в JavaScript нет области видимости), JSLint видит это как объявление переменной, которая уже была объявлена ​​.

Именование переменных e1, e2, и т. Д. предотвратит это предупреждение от JSLint.Правда ли это проблема?Спецификация ECMAScript 5, раздел 12.14, гласит: «Независимо от того, как элемент управления покидает блок, LexicalEnvironment всегда возвращается в свое прежнее состояние».На самом деле это действительно так:

try {
    throw new Error("testing 1234");
} catch(fooBarBaz){
    alert("Catch: " + fooBarBaz);    // works
}

alert(fooBarBaz);    // throws exception

Итак, в заключение, это просто ограничение JSLint и вряд ли приведет к какой-либо практической проблеме.

0 голосов
/ 18 ноября 2010

JSLint может просто ошибаться здесь.Согласно спецификации ECMAScript, ввод блока catch создает новую область видимости, внутри которой определяется переменная исключения.В вашем примере e действителен только внутри блока catch и не определен снаружи.Здесь нет переопределения.

0 голосов
/ 18 ноября 2010

Используйте разные переменные для каждой попытки / улова.

0 голосов
/ 18 ноября 2010

Попробуйте использовать другую переменную, возможно, она запуталась, потому что e обычно резервируется для обработчиков событий.

0 голосов
/ 18 ноября 2010

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

...