18

我一直在使用 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) {}

我在互联网上找不到任何关于为什么这会修复错误的解释。有谁知道发生了什么或为什么这解决了问题?

谢谢你。

4

1 回答 1

31

我认为您是对的- jslint 以前没有这样抱怨过。相反,它告诉你你需要对 做点什么ex,对吗?稍后我将检查 github 以查看和编辑它。 编辑:[你]的大收获!JSLint 的作者 Crockford于今年 4 月 29 日在第 3444 行附近添加了这个。catch而且他在 jslint 的源代码中使用了空块,所以我想他也必须给我们提供帮助。;^)

JSLint 希望您将空catch块与ignore变量名混为一谈,以便阅读您的代码的人可以清楚地看出您有意不在catch块中执行任何操作。正如 Crockford在其他地方所说,他认为“编写正确的程序是很困难的,同时使用难以区分明显错误的习语。”

1.)ex使用过(好的)

所以(我猜你知道)如果你编写这段代码并使用exjslint 不会抱怨。

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

var spam;

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

2.)ex未使用的手段ignore(也可以)

因此,如果您的意思是不对.exexignore

/*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) {

Crockford 的另一个超显式“不要编写看起来像错误的代码”。

(旁白:在讨论这个主题时,看看Why are empty catch blocks a bad idea可能会很有趣。老实说,尽管ignore基于该讨论,这可能是一个有用的约定(我的意思是,它包括 Skeet 反对 emptycatch块!),我有点惊讶Crockford允许ignorekludge,因为上面的链接有一些参数感觉很像他称一些正则表达式“不安全”。)

于 2013-05-18T16:56:41.630 回答