Javascript 使用JSLint并遵循它有意义吗?

Javascript 使用JSLint并遵循它有意义吗?,javascript,jquery,validation,jslint,Javascript,Jquery,Validation,Jslint,最近我一直在使用jQuery和JavaScript编写一些JS代码,我想我会尝试一下JSLint。我要说的是,代码包含各种函数和jQuery用法,在IE8和最新的Firefox中运行良好(没有任何错误)。 代码还验证为XHTML1.0过渡版(也很严格,但我主要希望它是过渡版有效) 然而,对于JSLint来说,一切都是错的。虽然我已经读到它非常严格,即使我只打开“好的部分”,它仍然像一个典型的HTML页面中70多个错误 首先是这样的(我到底为什么要删除该类型以使我的文档XHTML无效??) 第5行

最近我一直在使用jQuery和JavaScript编写一些JS代码,我想我会尝试一下JSLint。我要说的是,代码包含各种函数和jQuery用法,在IE8和最新的Firefox中运行良好(没有任何错误)。 代码还验证为XHTML1.0过渡版(也很严格,但我主要希望它是过渡版有效)

然而,对于JSLint来说,一切都是错的。虽然我已经读到它非常严格,即使我只打开“好的部分”,它仍然像一个典型的HTML页面中70多个错误

首先是这样的(我到底为什么要删除该类型以使我的文档XHTML无效??)

第5行出现问题字符67:不需要键入。
接着是一些深奥的错误,比如

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"]);
第41行的问题字符41:使用数组文字符号[]。 var rows=新数组(); 第42行第30个字符出现问题:var语句太多。 对于(变量i=0;i 如果有人能为我提供这些错误的答案,特别是如何让JSLint了解jQuery并理解它,我将不胜感激

如果没有,请解释您是否使用它,以及您是否建议使用它

更新:


我将再等一天,等待更多的答案,如果有的话,然后我将以最多的赞成票接受答案。

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

请注意,有时会出现大量错误,但删除了第一个错误后,就会有十几个错误消失,就像编译代码一样

你能行

var rows = [];

关于第一个错误。

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


有时候JSLint会告诉你一些关键的事情,有时候它只是唠叨。你可能会在试图让它开心的时候迷失方向,但没有它你可能会迷失方向。就像其他任何工具一样,它的输入应该是谨慎的。我更喜欢把它想象成MS Word中的拼写检查器或语法检查器。有时候是对的,有时候是错的g、 有时我只是不在乎它告诉我什么。

以下是我能给出的最好答案。也许有人可以填补一些空白。不过,这些似乎都与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
建议在创建对象或数组时不要调用构造函数。我真的不知道为什么。有人吗


关于这一点我不太确定,只是如果我没记错的话,Crockford不喜欢
++
--


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


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

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

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

关于
类型
属性,您可以找到作者的更多意见,他说该属性是“必需和非必需的”,但如果您验证文档,您显然需要它

我同意,使用数组文字符号
[]
与数组构造函数相比,有一些差异可能导致两种语法的行为不同,例如:

 [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 x = 0;
if (true) {
  var x = 1; // useless var, x already declared
}
x; // 1
array[++id] = x;
因此,为了一致性和简洁性,文字符号更好

关于“太多的var语句”,JavaScript没有块作用域,作用域在函数或全局级别,所有
var
语句都在代码执行之前进行求值-也就是提升-并使用
undefined
初始化,而赋值是在运行时进行的

例如:

 [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 x = 0;
if (true) {
  var x = 1; // useless var, x already declared
}
x; // 1
array[++id] = x;
变量声明的“提升”可在本例中显示:

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
保持
未定义
,因为它是在实际代码执行之前声明的,
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
语句

关于“意外使用“++”,这是我不太喜欢的另一条规则,作者认为“这些规则通过鼓励过度欺骗而导致糟糕的代码”

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

 [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 x = 0;
if (true) {
  var x = 1; // useless var, x already declared
}
x; // 1
array[++id] = x;
致:

这更清楚,但无论如何,在IMO的
for
语句中,它不会引起任何混淆

关于最后一个“['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

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