Javascript 使用JSLint并遵循它有意义吗?
最近我一直在使用jQuery和JavaScript编写一些JS代码,我想我会尝试一下JSLint。我要说的是,代码包含各种函数和jQuery用法,在IE8和最新的Firefox中运行良好(没有任何错误)。 代码还验证为XHTML1.0过渡版(也很严格,但我主要希望它是过渡版有效) 然而,对于JSLint来说,一切都是错的。虽然我已经读到它非常严格,即使我只打开“好的部分”,它仍然像一个典型的HTML页面中70多个错误 首先是这样的(我到底为什么要删除该类型以使我的文档XHTML无效??)Javascript 使用JSLint并遵循它有意义吗?,javascript,jquery,validation,jslint,Javascript,Jquery,Validation,Jslint,最近我一直在使用jQuery和JavaScript编写一些JS代码,我想我会尝试一下JSLint。我要说的是,代码包含各种函数和jQuery用法,在IE8和最新的Firefox中运行良好(没有任何错误)。 代码还验证为XHTML1.0过渡版(也很严格,但我主要希望它是过渡版有效) 然而,对于JSLint来说,一切都是错的。虽然我已经读到它非常严格,即使我只打开“好的部分”,它仍然像一个典型的HTML页面中70多个错误 首先是这样的(我到底为什么要删除该类型以使我的文档XHTML无效??) 第5行
第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我将再等一天,等待更多的答案,如果有的话,然后我将以最多的赞成票接受答案。你应该使用它。它在一个浏览器中工作并不意味着它在所有浏览器中都能工作;有些浏览器比其他浏览器更宽松。例如,在数组中使用尾随逗号将在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”声明。