16

最近我一直在使用 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 并理解它,我将不胜感激。

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

更新:

我将再等一天以获得更多答案,如果有的话,那么我会接受投票最多的答案。

4

7 回答 7

26

使用 JSLint 时要记住的一件事是,它建立在人们认为什么是“好的部分”的观点之上。

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

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

我同意使用 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

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

关于“Too many var statements”,JavaScript 没有块范围,范围是函数或全局级别,所有var语句在代码执行之前评估 - 也称为提升 - 并使用 初始化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;
})();

如您所见xundefined因为它是在实际代码执行之前声明的,所以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;

哪个更清楚,但无论如何,在forIMO 声明的情况下,它根本不会引起任何混淆......

关于最后一个“['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
于 2010-09-19T14:56:08.197 回答
6

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

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

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

'too many vars' 错误意味着,给定函数中有大量 'var' 声明:Crockford 认可的风格是使用一个或很少的 'var' 声明,都在函数的顶部。您可以在一个 var 语句中声明多个变量,方法是用逗号分隔它们。

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

因此,jslint 好坏参半。一些特性(局部变量 vs 全局变量)是无价的,一些(脚本类型)只是令人讨厌,还有许多是可疑的好处但无害的。

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

于 2010-09-19T15:37:49.643 回答
5

有一个关于吸烟的程序员的老笑话。一位朋友说:“你真是个聪明人,难道你看不到包装上的警告,说香烟会杀死你吗?” 来了回复:“我是程序员。我们只关注错误,不关注警告。”

有时 JSLint 会告诉你一些重要的事情,有时它只是唠叨。你可能会为了让它快乐而迷路,但没有它你可能迷路。像任何其他工具一样,它的输入应该是一粒盐。我更喜欢把它想象成 MS Word 中的拼写检查器或语法检查器。有时是对的,有时是错的,有时我根本不在乎它告诉我什么。

于 2010-09-19T14:54:22.243 回答
1

JSLint 是一个代码质量工具。它不像 W3C 验证器。将其视为公司的每周代码审查。编码约定各不相同,JSLint 只是其中之一。可能有些观点您不同意,但如果您在团队中工作并且需要管理更大的代码库,JSLint 可以成为救命稻草。为什么?因为它会警告您有关令人困惑或容易出错的事情。

使用 JSLint 的最佳方法是:阅读它所说的所有内容,如果您不确定某些内容,请按照建议进行更正(这里似乎就是这种情况)。

原因是 JSLint 旨在避免混淆,如果您使用的东西可能会导致错误并且您不知道为什么,那么最好选择一个明确的替代方案。

如果您想了解这些建议背后的原因,请观看 Douglas Crockford 的 Javascript 视频。

最后,您可以关闭您认为无用的过滤器。

于 2010-09-19T17:04:52.363 回答
1

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

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

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

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

于 2010-09-19T17:07:58.587 回答
0

你应该使用它。它适用于一个浏览器这一事实并不意味着它适用于所有浏览器。有些人比其他人更宽容。例如,数组中的尾随逗号将在 IE 中中断,但在 FF 中有效。

请注意,有时您会遇到大量错误,但您会删除第一个和十几个错误,例如编译代码。

你可以做

var rows = [];

对于第一个错误。

于 2010-09-19T14:50:39.677 回答
0

这是我能给出的最佳答案。也许有人可以填补一些空白。不过,这些似乎都与 jQuery 无关。

此外,请参阅此文档以获取一些解释。

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

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


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

var rows = new Array();

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


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 不喜欢++and --


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

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

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

据我所知,这里似乎没有任何明显错误。从 JSLint 创建者的角度来看,主要是最佳实践建议。

于 2010-09-19T14:55:05.063 回答