Fork me on GitHub

JSLint Error Explanations

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


'{a}' was used before it was defined

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

当JSLint在遇到一个标示符不是var或者function声明的一部分时会抛出"'{a}' was used before it was defined"的错误。一些非常常见的该类错误的例子是引用了原生的DOM对象:

  • "'document' was used before it was defined"
  • "'window' was used before it was defined"
  • "'alert' was used before it was defined"
  • "'console' was used before it was defined"
  • "'require' was used before it was defined" (commonly seen with Node.js)

在下面这个例子中,我们尝试着给一个还未被声明的变量x赋值,然后尝试着通过不同的方式展示这个变量的值。同时我们也尝试着将y设置为一个未被定义的函数的返回值:

为什么会产生这个错误?

这个错误是为了强调存在危险的代码或者一些可能会造成严重错误的代码。你的代码也许可以正常运行,不报出任何错误,但是这会让其他的开发者感到迷惑,并且在某些情况下会造成严重的错误并影响你的其余的脚本的运行。

上面那个例子在非严格模式下是一段合法的JavaScript代码。它会用给定的标示符创建一个全局对象的属性(在浏览器中,全局对象就是window)。如果你不小心忽略了var关键字,你可能会将父作用域中的变量覆盖,从而会导致产生不可预料的行为。如果不是在严格模式下运行,在这种状况下(ES5 Annex C)由于赋值给一个未声明的变量是合法的,它会产生一个ReferenceError

Assignment to an undeclared identifier or otherwise unresolvable reference does not create a property in the global object. When a simple assignment occurs within strict mode code, its LeftHandSide must not evaluate to an unresolvable Reference. If it does a ReferenceError exception is thrown.

如果你引用了一个在其他地方被声明的标示符(也许是同一个页面中的其他JavaScript文件),可以通过global提示来告诉JSLint:

如果你不小心遗漏了var关键字,你可以简单的将其添加到语句中来解决。如果你故意遗漏了关键字(也许是为了允许其他作用域中访问该变量),那么就将其声明在最顶层的作用域中,使得其能在所有作用域中都有效:

如果这个错误是因为引用了内置的DOM对象,比如alert, document或者window,你可以通过设置一些JSLint的提示语句让分析器明白这些内置对象实际上是还是可以使用的。类似alert这样的函数被JSLint当做修改BUG的急救方法。考虑到此,你可以使用devel选项来防止这种错误:

其他常见的浏览器内置变量可以通过browser选项来提前声明:

最后,常见的Node.js内置变量可以通过node选项来提前声明:


comments powered by Disqus