Параметр перехвата JavaScript уже определен

Я пытаюсь понять , почему я получаю следующую ошибку: не , как обойти это.

Передача следующего кода в 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, и оказывается там ' Это очень веская причина для этого предупреждения. См. Ответ ниже.

20
задан Walt Stoneburner 25 May 2011 в 13:13
поделиться