Lately I’ve been writing some JS code using jQuery and JavaScript as it is and I thought I will give JSLint a try. Let me say that the code contains various functions and jQuery usages and it works fine (without any errors ) in IE8 and latest Firefox.
The code also validatas as XHTML 1.0 Transitional (and Strict too but I mostly want it to be Transitional valid).
However, with JSLint it’s like everything is wrong. While I have read about it being very strict, even if I turn on only “The Good Parts” it’s still like 70+ errors in a typical HTML page.
It starts out with this (why in the world would I want to remove the type to make my documents XHTML invalid??)
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
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"]);
If anyone can provide me answers to these errors and especially, how to make JSLint be aware of jQuery and understand it, I will appreciate it.
If not, please explain whether you use it or not and whether you advice to use it or not.
UPDATE:
I’m going to wait one more day for more answers, if any, then I’ll accept the answer with the most upvotes.
A thing to remember when using JSLint is that is built on the opinion about what one person thinks is the “Good Parts”.
I think is a great tool but there are rules that I don’t agree with.
About the
typeattribute, you can find more about the opinion of the author here he says that the attribute is “required and non necessary”, but if you validate your documents you clearly need it.With the use of the Array literal notation
[]vs. the Array constructor, I agree, there are differences that can make the two syntaxes behave different, for example:So, for consistency an brevity the literal notation is better.
About the “Too many var statements”, JavaScript has no block-scope, the scope is at function or global level, and all
varstatements are evaluated before the code execution -aka hoisting- and they are initialized withundefined, while the assignments are made at runtime.For example:
And the “hoisting” of variable declaration can be shown in this example:
As you can see
xholdsundefinedbecause it is declared before the actual code execution, thevarstatements are hoisted to the top of their enclosing scope:So that rule wants to actually make the code to resemble what will happen, all the
varstatements at first place.About the “Unexpected use of ‘++'”, this is another rule that I don’t quite like, the author thinks that “those contribute to bad code by encouraging excessive trickiness”.
When I use them in some expression, I try to extract the operator usage to an alone statement, for example:
To:
Which is more clearer, but anyway in the case of a
forstatement IMO it can’t cause any confusion at all…About the last one “[‘PrettyId’] is better written in dot notation.”, JSLint expects the usage of the bracket notation to be “dynamic”, it expects to see an expression there, not a String literal that contains a valid identifier name, the bracket notation should be used only when you want to access a property with a name that clashes with a reserved word e.g.:
Or when a property contains characters that are not a valid identifier, e.g.: