使用JSLint并遵循它是否有意义?

时间:2010-09-19 14:38:03

标签: javascript jquery validation jslint

最近我一直在使用jQuery和JavaScript编写一些JS代码,我想我会试试JSLint。让我说代码包含各种函数和jQuery用法,它在IE8和最新的Firefox中运行良好(没有任何错误)。 该代码也被认为是XHTML 1.0 Transitional(也是Strict,但我主要希望它是Transitional有效的。)

但是,使用JSLint就像一切都错了。虽然我读到它非常严格,但即使我只打开“好的部分”,它仍然像典型的HTML页面中的70多个错误。

它从这开始(为什么在世界上我想要删除类型以使我的文档XHTML无效?)

Problem at line 5 character 67: type is unnecessary.

<script src="/Scripts/jquery-1.4.2.min.js" type="text/javascript"></script>

继续发出像

这样的深奥错误
Problem at line 41 character 41: Use the array literal notation [].

var rows = new Array();

Problem at line 42 character 30: Too many var statements.

for (var i = 0; i < data.length; i++) {

Problem at line 42 character 55: Unexpected use of '++'.

for (var i = 0; i < data.length; i++) {

Problem at line 64 character 50: ['PrettyId'] is better written in dot notation.

var item = $("#item_" + data["PrettyId"]);

如果有人能为我提供这些错误的答案,尤其是如何让JSLint了解jQuery并理解它,我将不胜感激。

如果没有,请说明您是否使用它,以及您是否建议使用它。

更新:

如果有更多的答案,我会再等一天以获得更多答案,然后我会接受最多的回答。

7 个答案:

答案 0 :(得分:26)

使用JSLint时要记住的一点是建立在一个人认为“好的部分”的观点之上。

我认为这是一个很好的工具,但有一些我不同意的规则。

关于type属性,您可以找到有关作者here的意见的更多信息,他说该属性是“必需且无必要的”,但如果您验证文档,则显然需要它

使用Array文字符号[]与Array构造函数,我同意,有些差异可以使两种语法表现不同,例如:

 [5]; // one-element array
 ["5"]; // one-element array

 new Array(5); // empty array but its length is initialized with 5
 new Array("5"); // one-element array

因此,为了保持一致性简洁,字面符号更好。

关于“太多var语句”,JavaScript没有块范围,范围是函数或全局级别,所有var语句在代码执行-aka提升之前进行评估 - 并且它们被初始化使用undefined,而分配是在运行时进行的。

例如:

var x = 0;
if (true) {
  var x = 1; // useless var, x already declared
}
x; // 1

在这个例子中可以显示变量声明的“提升”:

var x = 5;  // global
(function () {
  alert(x); // alerts `undefined`, x declared but unassigned in this scope
  alert(y); // ReferenceError, y is undeclared

  var x = 10;
})();

正如您所看到的,x保持undefined因为它是在实际代码执行之前声明的,所以var语句被提升到其封闭范围的顶部:

var x = 5;  // global
(function () {
  var x;
  alert(x); // alerts `undefined`, x declared but unassigned
  alert(y); // ReferenceError, y is undeclared

  x = 10; // assignment is made
})();

因此,该规则希望实际上使代码与将要发生的事情类似,首先是所有var语句。

关于“意外使用'++'”,这是另一个我不太喜欢的规则,作者认为“那些通过鼓励过度诡计而导致错误代码”。

当我在某个表达式中使用它们时,我尝试将运算符用法提取到单独的语句中,例如:

array[++id] = x;

要:

id+=1;
array[id] = x;

哪个更清楚,但无论如何,在for陈述IMO的情况下,它根本不会引起任何混淆......

关于最后一个“['PrettyId']最好用点表示法编写。”,JSLint期望括号表示法的用法是“动态的”,它希望在那里看到一个表达式,不是包含有效标识符名称的字符串文字,只有当您想要访问名称与保留字冲突的属性时才应使用括号表示法,例如:

data.function;    // SyntaxError in ECMAScript 3 based implementations
data["function"]; // Ok

或者当属性包含不是有效标识符的字符时,例如:

data.foo-bar;    // it access the property `foo` minus a `bar` variable
data["foo-bar"]; // Ok

data.foo bar;    // SyntaxError, unexpected `bar` identifier
data["foo bar"]; // Ok

答案 1 :(得分:6)

我在.js文件上使用jslint并找到选项和修复的组合以使其快乐。我发现它提高了我的代码质量。我建议运行它,即使你只用它来隔离省略的'var'声明。

我通过不针对html文件运行来避免脚本标记警告。我在.js文件上系统地使用jslint,但在html上没有。我发现声明在包含的脚本中定义的所有全局标识符,但jslint不可见,这太麻烦了。

Crockford的书“Javascript:The Good Parts”解释了很多(如果不是全部)jslint警告,其中一些是基于感知的漏洞倾向。 'new Array()'vs'[]'警告是基于Doug对'new'运算符的厌恶。为各种构造函数省略'new'通常是有效的代码,但不是正确的代码,并且使用替代语法可以避免这种风险。

'太多变量'错误意味着,给定函数中的大量'var'声明:Crockford认可的样式是使用一个或几个'var'声明,所有这些都在函数的顶部。您可以在一个var语句中声明多个变量,方法是用逗号分隔它们。

'++'警告是另一个基于错误倾向的警告;使用'+ = 1'意味着相同的事情,Doug认为它不易出错。

因此,jslint是一个混合包。一些功能(本地人与全局)是无价的,有些(脚本类型)只是令人讨厌,许多功能可疑但无害。

jQuery本身传递jslint检查,如下所述: http://docs.jquery.com/JQuery_Core_Style_Guidelines#JSLint

答案 2 :(得分:5)

有一个关于吸烟的程序员的老笑话。一位朋友说,“你是一个非常聪明的家伙,难道你不能看到包装上的警告说香烟会杀了你吗?”回答说:“我是程序员。我们只注意错误,而不是警告。”

有时JSLint告诉你一些关键的东西,有时它只是唠叨。你可能会迷失,试图让它快乐,但你可能会在没有它的情况下 迷失。像任何其他工具一样,它的输入应该是一粒盐。我更喜欢把它想象成MS Word中的拼写检查或语法检查。有时它是对的,有时是错的,有时我只是不在乎它告诉我什么。

答案 3 :(得分:1)

JSLint是代码质量工具。它不像W3C验证器。考虑一下像公司的每周代码审查。编码约定各不相同,JSLint只是其中之一。可能有一些您不同意的观点,但如果您在团队中工作,并且您需要管理更大的代码库,那么JSLint可以节省生命。为什么?因为它会警告你容易混淆或容易出错的事情。

使用JSLint的最佳方法是:阅读它所说的一切,如果你不确定关于某些正确它的建议(似乎就是这种情况)这里)。

原因是JSLint意图避免混淆,如果你使用的东西可能会导致错误并且你不知道原因,那么最好选择明确的替代方案。< / p>

如果你想知道建议背后的原因,请观看Douglas Crockford关于Javascript的视频。

最后,您可以关闭无效的过滤器。

答案 4 :(得分:1)

当你开始在旧代码上使用它时会很痛。

但是它会为你节省很多时间。
JSLint可以检测到许多问题,只有在刷新页面时才能看到这些问题,或者当用户这样做时会更糟。
现在,当我有使用没有JSLint的编辑器

另一个优点是当您开始压缩您的JavaScript时。如果您通过JSLint检查,几乎可以肯定压缩没有问题。

话虽这么说,jquery有23个警告,其中大部分都是关于正则表达式,但被广泛使用而没有任何问题。

答案 5 :(得分:0)

你应该使用它。它在一个浏览器中工作的事实并不意味着它可以在所有浏览器中工作;有些人比其他人宽松。例如,在数组中使用尾随逗号将在IE中中断,但在FF中工作。

请注意,有时候会遇到大量错误,但是您会删除第一个和第十个错误,就像编译代码一样。

你可以做到

var rows = [];

表示第一个错误。

答案 6 :(得分:0)

以下是我能给出的最佳答案。也许有人可以填补一些空白。但是,看起来好像这些都与jQuery有关。

另外,请参阅this document了解一些解释。

Problem at line 5 character 67: type is unnecessary.

<script src="/Scripts/jquery-1.4.2.min.js" type="text/javascript"></script>
and goes on with esoteric errors like

我相信对于现代浏览器,在链接到外部js文件时不需要text/javascript


Problem at line 41 character 41: Use the array literal notation [].

var rows = new Array();

建议在创建Object或Array时 not 调用构造函数。老实说,我不确定为什么。任何人吗?


Problem at line 42 character 30: Too many var statements.

for (var i = 0; i < data.length; i++) {

我想你在同一范围内的其他地方声明了i变量。 javascript块不会创建范围,因此如果您有另一个for循环(例如)使用i,则它使用相同的变量。无需再次申报。


Problem at line 42 character 55: Unexpected use of '++'.

for (var i = 0; i < data.length; i++) {

不确定这一点,但如果我没记错的话,Crockford不喜欢++--


Problem at line 64 character 50: ['PrettyId'] is better written in dot notation.

var item = $("#item_" + data["PrettyId"]);

我相信.符号是首选,因为它更短更快(在某些浏览器中)。所以data.PrettyID代替。

据我所知,此处似乎并没有明显错误。主要是JSLint创建者的最佳实践建议。