Я пытаюсь понять , почему Я получаю следующую ошибку, а не как обойти ее.
Передача следующего кода в JSLint или JSHint приводит к ошибке 'err' уже определено.
/*jslint white: true, devel: true, onevar: true, browser: true, undef: true, nomen: true, regexp: true, plusplus: true, windows: true, bitwise: true, newcap: true, strict: true, maxerr: 50, indent: 4 */
function xyzzy() {
"use strict";
try { /*Step 1*/ } catch (err) { }
try { /*Step 2*/ } catch (err) { }
}
Здесь очевидно, что catch
ведет себя или должен вести себя как функция. Таким образом, err
не является ни глобальной переменной, ни локальной переменной для xyzzy
, а параметром для блока catch
.
При просмотре стандарта ECMA-262 , раздел 12.14, описывающий Оператор try
указывает, что предложение catch
принимает Идентификатор , то есть связано с исключением. Кроме того, семантическое правило производства для catch
относится к параметру , который передается, вызывая идентификатор в качестве аргумента .
Кажется, что для обычного читателя это означает, что приведенный выше код действителен и что, возможно, в инструментах lint есть ошибка.
Даже Самый строгий анализ проверки кода JavaScript в IntelliJ не сообщает о проблеме переопределения err
.
Больше беспокойства, если это переменная область видимости, то можно предположить, что err
истекает кровью в глобальное пространство, что создает целый ряд других проблем, и что вместо этого нужно объявить об этом заранее. , вот так:
/*jslint white: true, devel: true, onevar: true, browser: true, undef: true, nomen: true, regexp: true, plusplus: true, windows: true, bitwise: true, newcap: true, strict: true, maxerr: 50, indent: 4 */
function xyzzy() {
"use strict";
var err; // DECLARE err SO IT IS CERTAINLY LOCAL
try { /*Step 1*/ } catch (err) { }
try { /*Step 2*/ } catch (err) { }
}
Но теперь это приводит только к двум ошибкам около err
в каждом из операторов catch, что усугубляет проблему и потенциально приводит к затенению переменных .
Инструменты lint предполагают, что каждый блок catch
вводит не только свою собственную лексическую область, но и новую переменную. Это не может быть правдой.
Простое создание err1
, err2
, ... для успокоения инструментов статического анализа просто скрывает симптом и не способствует более чистому коду.
JavaScript Gurus : Это ошибка в инструменте lint, темный угол со спецификацией JavaScript или фундаментальное недопонимание того, что здесь происходит?
ОБНОВЛЕНИЕ: Написал Дугласу Крокфорду, автору JSLint, и оказалось, что для этого предупреждения есть очень веская причина. См. Ответ ниже.