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

Ошибка JSLint: ожидаемый "игнорировать" и вместо этого видел "ex"

Я использую JSLint все время, но только сегодня я столкнулся с ошибкой, которую я никогда раньше не видел. Со следующим кодом я получил ошибку, показанную ниже:

try {

  document.execCommand('BackgroundImageCache', false, true);

} catch (ex) {}

Ошибка:

Expected 'ignore' and instead saw 'ex'.
} catch (ex) {}

Итак, я изменил свой код на следующее, и ошибка исчезла:

try {

  document.execCommand('BackgroundImageCache', false, true);

} catch (ignore) {}

Я не могу найти никаких объяснений в Интернете относительно того, почему это исправит ошибку. Кто-нибудь знает, что и почему это устранило проблему?

Спасибо.

4b9b3361

Ответ 1

Я думаю, что вы правы - jslint так не жаловался. Вместо этого он сказал вам, что вам нужно что-то сделать с ex, правильно? Я проверю github, чтобы увидеть и отредактировать это позже. РЕДАКТИРОВАТЬ: Большой улов [от вас]! Crockford, автор JSLint, добавил это 29 апреля этого года вокруг строки 3444. И он использует пустые блоки catch в источнике jslint, поэтому Думаю, он тоже должен дать нам клод.; ^)

JSLint хочет, чтобы вы удаляли пустые catch блоки с ignore в качестве имени переменной, чтобы очевидным для людей, читающих ваш код, что вы намеренно подразумевали, чтобы ничего не делать в catch блок. Поскольку Crockford говорит в другом месте, он чувствует, что "трудно писать правильные программы при использовании идиом, которые трудно отличить от очевидных ошибок".

1.) ex используется (нормально)

Итак (как я предполагаю, вы знаете), если вы пишете этот код и что-то делаете с помощью ex, jslint не жалуется.

/*jslint browser: true, white:true, sloppy:true*/

var spam;

try {
    spam = "spam";
} catch (ex) {
    window.alert(ex);
}

2.) ex неиспользуемые средства ignore (тоже хорошо)

Итак, если вы хотите ничего не делать с ex, он хочет, чтобы код рассказывал людям, которых вы не испортили, оставив эквивалент ex там, назвав эту переменную ignore.

/*jslint browser: true, white:true, sloppy:true*/

var spam;

try {
    spam = "spam";
} catch (ignore) {
}

3.) ignore используется (ошибка!)

Итак, в типичном режиме Crockfordian вы теперь не можете использовать ignore и на самом деле что-то делать в блоке catch!

/*jslint browser: true, white:true, sloppy:true*/

var spam;

try {
    spam = "spam";
} catch (ignore) {
    window.alert(ignore);
}

Это дает

Неожиданный "игнорировать". } catch (ignore) {

Просто еще один гипер-явный "не делай код, похожий на ошибку", перемещаемый Крокфордом.

(Кроме того, может быть интересно взглянуть на Почему пустые блоки блокировки представляют собой плохую идею, пока вы на эту тему. Честно говоря, хотя ignore вероятно, является полезным соглашением, основанным на этом обсуждении (я имею в виду, что он включает в себя Skeet, спорящий о пустые блоки catch!), я немного удивлен, что Crockford допускает kludge ignore, поскольку приведенная выше ссылка содержит аргументы, которые много как его для того, чтобы называть некоторые регулярные выражения "небезопасными".)