最近我一直在使用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并理解它,我将不胜感激。
如果没有,请说明您是否使用它,以及您是否建议使用它。
更新:
如果有更多的答案,我会再等一天以获得更多答案,然后我会接受最多的回答。
答案 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)
请注意,有时候会遇到大量错误,但是您会删除第一个和第十个错误,就像编译代码一样。
你可以做到
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创建者的最佳实践建议。