Я пытаюсь понять , почему я получаю следующую ошибку: не , как обойти это.
Передача следующего кода в 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
принимает идентификатор , то есть привязанный к исключению.
/*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 : Это ошибка в инструменте lint, темный угол в спецификации JavaScript или фундаментальное непонимание того, что здесь происходит?
ОБНОВЛЕНИЕ: Написал Дугласу Крокфорду, автору книги JSLint, и оказывается там ' Это очень веская причина для этого предупреждения. См. Ответ ниже.