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

mar*_*are 16 javascript validation jquery 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>
Run Code Online (Sandbox Code Playgroud)

并继续深刻的错误,如

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"]);
Run Code Online (Sandbox Code Playgroud)

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

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

更新:

我要再等一天以获得更多答案,如果有的话,那么我会接受最多的回答.

CMS*_*CMS 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
Run Code Online (Sandbox Code Playgroud)

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

关于"Too many var statements",JavaScript没有块范围,范围在函数或全局级别,并且所有var语句在代码执行-aka提升之前进行评估 - 并且它们被初始化undefined,而分配是在运行.

例如:

var x = 0;
if (true) {
  var x = 1; // useless var, x already declared
}
x; // 1
Run Code Online (Sandbox Code Playgroud)

并且在此示例中可以显示变量声明的"提升":

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;
})();
Run Code Online (Sandbox Code Playgroud)

正如你所看到的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
})();
Run Code Online (Sandbox Code Playgroud)

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

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

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

array[++id] = x;
Run Code Online (Sandbox Code Playgroud)

至:

id+=1;
array[id] = x;
Run Code Online (Sandbox Code Playgroud)

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

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

data.function;    // SyntaxError in ECMAScript 3 based implementations
data["function"]; // Ok
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)


Rdb*_*ost 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


Rob*_*sto 5

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

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