Fork me on GitHub

JSLint Error Explanations

JSLint will hurt your feelings. It's time to make them better!


Unexpected label '{a}'

什么时候会产生这个错误?

当JSLint遇到一个标签语句声明内的语句不是迭代或者switch语句该标签语句在全局执行上下文中。以下这个例子包含了一个标签的var语句:

为什么会产生这个错误?

这个错误出现于两个不同的场景。两者都需要各自的解释。

一个标签语句内的语句不是迭代或switch语句

这个错误在这种情况下被抛出,是因为JSLint发现了一段毫无用处并可能让人感到困惑的代码。根据ECMAScript标准,任何语句都是可以被用作标签的。但是,由于语言本身没有定义goto语句,标签语句只有在与循环语句或者switch语句中的breakcontinue语句相关联的时候才有用。

规范总结了上面这一点在section §12.12中:

A Statement may be prefixed by a label. Labelled statements are only used in conjunction with labelled break and continue statements. ECMAScript has no goto statement.

所以,除非在标记forwhiledo或者switch语句时,否则没有任何理由去使用一个标记语句。

在全局运行上下文中使用标记语句

当JSLint检测到一段可能让人感到疑惑或者有危险的代码时,会抛出这个错误。同样的规则(如同上一节中详细描述的那样)适用于标记语句出现在全局执行作用域中,但是JSLint表现的略微不同。

JSLint不允许在全局作用域中使用标记语句,无论它们是迭代或者switch语句。这其实是相比于在函数上下文中标记语句被允许的。这背后的原因不明,但可能是因为那些支持goto语句的语言中,标记语句在全局作用域中是十分危险的。

由于除了迭代和switch语句中的break或者continue语句,没有任何方法可以引用到标记语句,并且由于每个语句都有自己的标记集,在全局作用域中的标记语句没有任何办法可以干涉到其他代码(你不能使用同一个标示符来重写一个定义在其他作用域的标记)。

更多的细节可以看这个Stack Overflow question.


comments powered by Disqus