Skip to content
Newer
Older
100644 744 lines (703 sloc) 38.8 KB
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
1 <html>
2 <head>
3 <title>JSLint: The JavaScript Code Quality Tool</title>
4 <link rel="icon" type="image/gif" href="http://www.JSLint.com/favicon.gif">
5 <style>
6 body {
7 background-color: linen;
8 margin-left: 8%;
9 margin-right: 8%;
10 }
1ebebf3 @douglascrockford cleanup
authored Jul 19, 2011
11 pre {
12 margin-left: 40px;
13 }
14 table {
15 margin: 10px;
16 border: 0px;
17 }
18 th, td {
19 border: black solid 1pt;
20 padding-left: 10px;
21 padding-right: 10px;
22 vertical-align: top;
23 }
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
24 th {
25 background-color: thistle;
26 }
27 td {
28 background-color: white;
29 }
1ebebf3 @douglascrockford cleanup
authored Jul 19, 2011
30 #top table {
31 margin: 0px;
32 }
33 #top td {
34 background-color: linen;
35 border: 0pt;
36 vertical-align: middle;
37 }
38 ul {
39 list-style-type: square;
40 }
41 input[type="button"] {
42 border: 2px solid black;
43 }
44 a:link {
45 color: darkblue;
46 }
47 a:visited {
48 color: purple;
49 }
50 a:hover {
51 color: blue;
52 text-decoration: underline;
53 }
54 a:active {color: red;
55 }
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
56 </style>
57 </head>
58 <body bgcolor="gainsboro">
59 <table id="top" border="0">
60 <tr>
61 <td><img src="jslint.gif" width="383" height="120" alt="JSLint"> </td>
62 <td>
63 <p><big><code>JSLint</code>: The
64 <a href="http://javascript.crockford.com/">JavaScript</a> Code Quality Tool</big></p>
65 <p><a href="http://www.crockford.com/" target="_top">&copy;2002 Douglas Crockford</a></p>
66 </td>
67 </tr>
68 </table>
69 <br clear="all">
70 <h2 id=warning>Warning!</h2>
71 <p><a href="http://www.JSLint.com" target="_blank"><code>JSLint</code></a>
72 will hurt your feelings.</p>
73 <h2 id=what>What is <code>JSLint</code>?</h2>
74
75 <p><a href="http://www.JSLint.com" target="_blank"><code>JSLint</code></a>
76 is a JavaScript program that looks for problems in JavaScript programs.
77 It is a code quality tool.</p>
78
79 <p>When <a href="http://en.wikipedia.org/wiki/C_programming_language">C</a>
80 was a <a href="http://cm.bell-labs.com/cm/cs/who/dmr/chist.html">young</a>
81 programming language, there were several common programming errors that
82 were not caught by the primitive compilers, so an accessory program called
83 <code><a href="http://en.wikipedia.org/wiki/Lint_programming_tool">lint</a></code>
84 was developed that would scan a source file, looking for problems.</p>
85
86 <p>As the language matured, the definition of the language was
87 strengthened to eliminate some insecurities, and compilers got better
88 at issuing warnings. <code>lint</code> is no longer needed.</p>
89
90 <p><a href="http://javascript.crockford.com/">JavaScript</a> is a young-for-its-age
91 language. It was originally intended to do small tasks in webpages, tasks
92 for which Java was too heavy and clumsy. But JavaScript is a very capable
93 language, and it is now being used in larger projects. Many of the features
6735394 @douglascrockford Cleanup.
authored Dec 2, 2010
94 that were intended to make the language easy to use are troublesome when projects become complicated. A <code>lint</code> for JavaScript is needed: <a href="http://www.JSLint.com/"><code>JSLint</code></a>,
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
95 a JavaScript syntax checker and validator.</p>
96
97 <p><code>JSLint</code> takes a JavaScript source and scans it. If it finds
98 a problem, it returns a message describing the problem and an approximate
99 location within the source. The problem is not necessarily a syntax error,
100 although it often is. <code>JSLint</code> looks at some style conventions
101 as well as structural problems. It does not prove that your program is
102 correct. It just provides another set of eyes to help spot problems.</p>
103
104 <p><code>JSLint</code> defines a professional subset of JavaScript, a stricter
105 language than that defined by <a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm" target="ecma">Third
106 Edition of the <i>ECMAScript Programming Language Standard</i></a>. The
107 subset is related to recommendations found in <a href="http://javascript.crockford.com/code.html" target="sun"><i>Code
108 Conventions for the JavaScript Programming Language</i></a>. </p>
109 <p>JavaScript is a sloppy language, but inside it there is an elegant, better
110 language. <code>JSLint</code> helps you to program in that better language
6735394 @douglascrockford Cleanup.
authored Dec 2, 2010
111 and to avoid most of the slop. JSLint will reject programs that browsers will accept because JSLint is concerned with the quality of your code and browsers are not. You should accept all of JSLint's advice.</p>
112 <p><code>JSLint</code> can operate on JavaScript source, HTML source, CSS source, or <a href="http://www.JSON.org/">JSON</a>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
113 text.</p>
114 <h2 id=global>Global Variables</h2>
115 <p>JavaScript's <a href="http://yuiblog.com/blog/2006/06/01/global-domination/">biggest
116 problem</a> is its dependence on global variables, particularly implied
117 global variables. If a variable is not explicitly declared (usually with
118 the <code>var</code> statement), then JavaScript assumes that the variable
119 was global. This can mask misspelled names and other problems.</p>
120 <p><code>JSLint</code> expects that all variables and functions are declared
121 before they are used or invoked. This allows it to detect implied global
122 variables. It is also good practice because it makes programs easier to
123 read.</p>
124 <p>Sometimes a file is dependent on global variables and functions that
125 are defined elsewhere. You can identify these to <code>JSLint</code> with a <code>var</code> statement that lists the global functions and objects
126 that your program depends on. </p>
127 <p>A global declaration can look like this:</p>
128 <pre>var getElementByAttribute, breakCycles, hanoi;</pre>
9f0303c @douglascrockford appear
authored May 22, 2011
129 <p>The declaration should appear near the top of the file. It must appear before the use of the variables
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
130 it declares. </p>
131 <p>It is necessary to use a <code>var</code> statement to declare a variable before that variable is assigned to. </p>
44eec74 @douglascrockford Adrian
authored Jun 14, 2011
132 <p><code>JSLint</code> also recognizes a <code>/*global */</code> directive that can indicate to <code>JSLint</code> that variables used in this file were defined in other files. The comment can contain a comma separated list of names. Each name can optionally be followed by a colon and either <code>true</code> or <code>false</code>, <code>true</code> indicating that the variable may be assigned to by this file, and <code>false</code> indicating that assignment is not allowed (which is the default). The directive respects function scope.</p>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
133 <p id=browser>Some globals can be predefined for you. Select the <i>Assume
134 a browser</i> (<code>browser</code>) <a href="#options">option</a> to
135 predefine the standard global properties that are supplied by web browsers,
136 such as <code>document</code> and <code>addEventListener</code>. It has the same
137 effect as this comment:</p>
138 <blockquote>
df39101 @douglascrockford option.browser
authored Feb 11, 2011
139 <code>/*global
1ebebf3 @douglascrockford cleanup
authored Jul 19, 2011
140 clearInterval: false, clearTimeout: false, document: false, event: false, frames: false, history: false, Image: false, location: false, name: false, navigator: false, Option: false, parent: false, screen: false, setInterval: false, setTimeout: false, window: false, XMLHttpRequest: false
df39101 @douglascrockford option.browser
authored Feb 11, 2011
141 */</code></blockquote>
e752a55 @douglascrockford option.node
authored Mar 30, 2011
142 <p>Select the
143 <em>Assume console, alert, ...</em>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
144 (<code>devel</code>) <a href="#options">option</a> to predefine globals that are useful in development but that should be avoided in production, such as <code>console</code> and <code>alert</code>. It has the same
145 effect as this comment:</p>
396d71f @douglascrockford WSH
authored Aug 16, 2011
146 <pre>/*global alert: false, confirm: false, console: false, Debug: false, opera: false, prompt: false, WSH: false */</pre>
706c485 @douglascrockford option.node
authored Mar 22, 2011
147 <p id=node>Select the
e752a55 @douglascrockford option.node
authored Mar 31, 2011
148 <em>Assume Node.js</em>
706c485 @douglascrockford option.node
authored Mar 22, 2011
149 (<code>node</code>) <a href="#options">option</a> to predefine globals that are used in the Node.js environment<code></code>. It has the same
150 effect as this comment:</p>
816fc05 @douglascrockford node
authored Sep 26, 2011
151 <blockquote><code>/*global Buffer: false, clearInterval: false, clearTimeout: false, console: false, exports: false, global: false, module: false, process: false, querystring: false, require: false, setInterval: false, setTimeout: false, __filename: false, __dirname: false */</code></blockquote>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
152 <p id=rhino>Select the <i>Assume Rhino</i> (<code>rhino</code>) <a href="#options">option</a>
706c485 @douglascrockford option.node
authored Mar 22, 2011
153 to predefine the global properties provided by the Rhino environment.
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
154 It has the same effect as this statement:</p>
155 <blockquote>
156 <code>/*global defineClass: false, deserialize: false, gc: false, help: false, load: false, loadClass: false, print: false, quit: false, readFile: false, readUrl: false, runCommand: false, seal: false, serialize: false, spawn: false, sync: false, toint32: false, version: false */ </code>
157 </blockquote>
158 <p id=widget>Select the <i>Assume a Yahoo Widget</i> (<code>widget</code>)
159 <a href="#options">option</a> to predefine the global properties provided
160 by the Yahoo! Widgets environment. It has the same effect as this statement:</p>
161 <blockquote>
162 <code>/*global alert: true, animator: true, appleScript: true, beep: true, bytesToUIString: true, Canvas: true, chooseColor: true, chooseFile: true, chooseFolder: true, closeWidget: true, COM: true, convertPathToHFS: true, convertPathToPlatform: true, CustomAnimation: true, escape: true, FadeAnimation: true, filesystem: true, Flash: true, focusWidget: true, form: true, FormField: true, Frame: true, HotKey: true, Image: true, include: true, isApplicationRunning: true, iTunes: true, konfabulatorVersion: true, log: true, md5: true, MenuItem: true, MoveAnimation: true, openURL: true, play: true, Point: true, popupMenu: true, preferenceGroups: true, preferences: true, print: true, prompt: true, random: true, Rectangle: true, reloadWidget: true, ResizeAnimation: true, resolvePath: true, resumeUpdates: true, RotateAnimation: true, runCommand: true, runCommandInBg: true, saveAs: true, savePreferences: true, screen: true, ScrollBar: true, showWidgetPreferences: true, sleep: true, speak: true, Style: true, suppressUpdates: true, system: true, tellWidget: true, Text: true, TextArea: true, Timer: true, unescape: true, updateNow: true, URL: true, Web: true, widget: true, Window: true, XMLDOM: true, XMLHttpRequest: true, yahooCheckLogin: true, yahooLogin: true, yahooLogout: true */</code>
163 </blockquote>
164 <p id=windows>Select the <i>Assume Windows</i> (<code>windows</code>)
165 <a href="#options">option</a> to predefine the global properties provided by Microsoft Windows. It has the same effect as this statement:</p>
166 <blockquote>
396d71f @douglascrockford WSH
authored Aug 16, 2011
167 <p><code>/*global ActiveXObject: false, CScript: false, Debug: false, Enumerator: false, System: false, VBArray: false, WScript: false, WSH: false */</code></p>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
168 </blockquote>
169 <h2 id=semicolon>Semicolon</h2>
6735394 @douglascrockford Cleanup.
authored Dec 2, 2010
170 <p>JavaScript uses a C-like syntax which requires the use of semicolons to delimit certain
171 statements. JavaScript attempts to make those semicolons optional with a semicolon
172 insertion mechanism. This is dangerous because it can mask errors.</p>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
173 <p>Like C, JavaScript has <code>++</code> and <code>--</code> and <code>(</code> operators
174 which can be prefixes or suffixes. The disambiguation is done by the semicolon.</p>
175 <p>In JavaScript, a linefeed can be whitespace or it can act as a semicolon.
176 This replaces one ambiguity with another. </p>
177 <p><code>JSLint</code> expects that every statement be followed by <code>;</code> except
178 for <code>for</code>, <code>function</code>, <code>if</code>, <code>switch</code>, <code>try</code>, and
179 <code>while</code>. <code>JSLint</code> does not expect to see unnecessary semicolons or the
180 empty statement.</p>
181 <h2 id=comma>Comma</h2>
182 <p>The comma operator can lead to excessively tricky expressions. It can also
183 mask some programming errors.</p>
184 <p><code>JSLint</code> expects to see the comma used as a separator, but not as an
185 operator (except in the initialization and incrementation parts of the <code>for</code>
186 statement). It does not expect to see elided elements in array literals. Extra
187 commas should not be used. A comma should not appear after the last element
188 of an array literal or object literal because it can be misinterpreted by some
189 browsers. </p>
190 <h2 id=scope>Scope</h2>
191
192 <p>In many languages, a block introduces a scope. Variables introduced in
193 a block are not visible outside of the block.</p>
194
195 <p>In JavaScript, blocks do not introduce a scope. There is only function-scope.
196 A variable introduced anywhere in a function is visible everywhere in
197 the function. JavaScript's blocks confuse experienced programmers and
198 lead to errors because the familiar syntax makes a false promise.</p>
199
200 <p><code>JSLint</code> expects blocks with <code>function</code>, <code>if</code>,
201 <code>switch</code>, <code>while</code>, <code>for</code>, <code>do</code>,
202 and <code>try</code> statements and nowhere else. </p>
203 <p>In languages with block scope, it is usually recommended that variables
204 be declared at the site of first use. But because JavaScript does not
205 have block scope, it is wiser to declare all of a function's variables
206 at the top of the function. It is recommended that a single <code>var</code>
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
207 statement be used per function. This can be declined with the <code>vars</code>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
208 <a href="#options">option</a>.</p>
209
210 <h2 id=required>Required Blocks</h2>
211
212 <p><code>JSLint</code> expects that <code>if</code>, <code>while</code>,
213 <code>do</code> and <code>for</code> statements will be made with blocks
214 <code>{</code>that is, with statements enclosed in braces<code>}</code>.</p>
215
216 <p>JavaScript allows an <code>if</code> to be written like this:</p>
217
218 <pre>if (<i>condition</i><code>)
219 </code><i>statement</i>;</pre>
220
221 <p>That form is known to contribute to mistakes in projects where many programmers
222 are working on the same code. That is why <code>JSLint</code> expects the use of
223 a block:</p>
224
225 <pre>if (<i>condition</i>) {
226 <i>statements</i>;
227 }</pre>
228
229 <p>Experience shows that this form is more resilient.</p>
230
231 <h2 id=expression>Expression Statements</h2>
232 <p>An expression statement is expected to be an assignment or a function/method
233 call or <code>delete</code>. All other expression statements are considered
234 to be errors.</p>
235 <h2 id=forin><code>for</code> <code>in</code></h2>
236 <p>The <code>for</code> <code>in</code> statement allows for looping through
237 the names of all of the properties of an object. <a href="http://yuiblog.com/blog/2006/09/26/for-in-intrigue/">Unfortunately,
d4189ff @douglascrockford properties
authored Mar 11, 2011
238 it also loops through all of the properties that were inherited through
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
239 the prototype chain.</a> This has the bad side effect of serving up method
d4189ff @douglascrockford properties
authored Mar 11, 2011
240 functions when the interest is in data properties. If a program is written without awareness of this situation, then it can fail.</p>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
241 <p>The body of every <code>for</code> <code>in</code> statement should be
242 wrapped in an <code>if</code> statement that does filtering. It can select
243 for a particular type or range of values, or it can exclude functions,
244 or it can exclude properties from the prototype. For example,</p>
245 <pre>for (name in object) {
246 if (object.hasOwnProperty(name)) {
247 ....
248 }
249
250 }</pre>
251
252 <h2 id=switch><code>switch</code></h2>
253 <p>A <a href="http://yuiblog.com/blog/2007/04/25/id-rather-switch-than-fight/">common
254 error</a> in <code>switch</code> statements is to forget to place a <code>break</code>
255 statement after each case, resulting in unintended fall-through. <code>JSLint</code>
256 expects that the statement before the next <code>case</code> or <code>default</code>
257 is one of these: <code>break</code>, <code>return</code>, or <code>throw</code>.
258 </p>
259 <h2 id=var><code>var</code></h2>
260
261 <p>JavaScript allows <code>var</code> definitions to occur anywhere
262 within a function. <code>JSLint</code> is more strict.</p>
263
264 <p><code>JSLint</code> expects that a <code>var</code> will be declared
265 only once, and that it will be declared before it is used.</p>
266 <p><code></code><code>JSLint</code> expects that a <code>function</code>
267 will be declared before it is used.</p>
268 <p><code>JSLint</code> expects that parameters will not also be declared
269 as vars. </p>
270
271 <p><code>JSLint</code> does not expect the <code>arguments</code> array to be declared
272 as a <code>var</code>.</p>
273 <p><code>JSLint</code> does not expect that a var will be defined in a block.
274 This is because JavaScript blocks do not have block scope. This can have
275 unexpected consequences. Define all variables at the top of the function.</p>
276
277 <h2 id=with><code>with</code></h2>
278
279 <p>The <code>with</code> statement was intended to provide a shorthand in accessing
d4189ff @douglascrockford properties
authored Mar 11, 2011
280 properties in deeply nested objects. Unfortunately, it behaves <a href="http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/">very
281 badly</a> when setting new properties. Never use the <code>with</code> statement. Use
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
282 a <code>var</code> instead.</p>
283
284 <p><code>JSLint</code> does not expect to see a <code>with</code> statement.</p>
285
286 <h2 id=assignment>=</h2>
287 <p><code>JSLint</code> does not expect to see an assignment statement in
288 the condition part of an <code>if</code> or <code>for</code> or <code>while</code>
289 <code></code> or <code>do</code> statement. This is because it is more
290 likely that </p>
291 <pre>if (a = b) {
292 ...
293 }</pre>
294 <p>was intended to be </p>
295 <pre>if (a == b) {
296 ...
297 }</pre>
298 <p>It is difficult to write correct programs while using idioms that are
9d80d80 @douglascrockford asignment unwrapped
authored Jan 30, 2011
299 hard to distinguish from obvious errors.</p>
ba257de @douglascrockford eqeq
authored Jun 12, 2011
300 <h2 id=eqeq>== and !=</h2>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
301 <p>The <code>==</code> and <code>!=</code> operators do type coercion before
302 comparing. This is bad because it causes <code>' \t\r\n' == 0</code> to
ca4cfb5 @douglascrockford Adrian
authored Jun 14, 2011
303 be <code>true</code>. This can mask type errors. JSLint cannot reliably determine if == is being used correctly, so it is best to not use <code>==</code> and != and to always use the more reliable <code>===</code> and <code>!==</code> operators instead. </p>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
304 <p align="left">If you only care that a value is <i>truthy</i> or <i>falsy</i>,
305 then use the short form. Instead of </p>
306 <pre align="left">(foo != 0)</pre>
307 <p align="left">just say </p>
308 <pre align="left">(foo)</pre>
309 <p align="left">and instead of</p>
310 <pre align="left">(foo == 0)</pre>
311 <p align="left"> say</p>
312 <pre align="left">(!foo)</pre>
ba257de @douglascrockford eqeq
authored Jun 12, 2011
313 <p>There is an <code>eqeq</code> <a href="#options">option</a> that allows the use of <code>==</code> and <code>!=</code>.</p>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
314 <h2 id=labels>Labels</h2>
315 <p>JavaScript allows any statement to have a label, and labels have a
316 separate name space. <code>JSLint</code> is more strict.</p>
317
318 <p><code>JSLint</code> expects labels only on statements that interact
319 with <code>break</code>: <code>switch</code>, <code>while</code>,
320 <code>do</code>, and <code>for</code>. <code>JSLint</code> expects that labels
321 will be distinct from vars and parameters.</p>
322
323 <h2 id=unreachable>Unreachable Code</h2>
324 <p><code>JSLint</code> expects that
325 a <code>return</code>, <code>break</code>, <code>continue</code>,
326 or <code>throw</code> statement will be followed by
327 a <code>}</code> or <code>case</code> or <code>default</code>.</p>
328
329 <h2 id=pluses>Confusing Pluses and Minuses</h2>
330
331 <p><code>JSLint</code> expects that <code>+</code> will not be followed by
332 <code>+</code> or <code>++</code>, and that <code>-</code> will not be followed
333 by <code>-</code> or <code>--</code>. A misplaced space can turn <code>+ +</code> into <code>++</code>, an error that is difficult to see. Use parens to avoid confusion..</p>
334 <h2 id=inc><code>++</code> and <code>--</code></h2>
335 <p>The <code>++</code> <small>(increment)</small> and <code>--</code> <small>(decrement)</small>
336 operators have been known to contribute to bad code by encouraging excessive
337 trickiness. They are second only to faulty architecture in enabling to
44eec74 @douglascrockford Adrian
authored Jun 14, 2011
338 viruses and other security menaces. Also, preincrement/postincrement confusion can produce off-by-one errors that are extremely difficult to diagnose. There is a <code>plusplus</code> <a href="#options">option</a>
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
339 that allows the use of these operators.</p>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
340 <h2 id=bitwise>Bitwise Operators</h2>
341 <p>JavaScript does not have an integer type, but it does have bitwise operators.
342 The bitwise operators convert their operands from floating point to integers
343 and back, so they are not as efficient as in C or other languages. They
344 are rarely useful in browser applications. The similarity to the logical
345 operators can mask some programming errors. The <code>bitwise</code> <a href="#options">option</a>
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
346 allows the use of these operators: <code>&lt;&lt; &gt;&gt; &gt;&gt;&gt;
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
347 ~ &amp; |</code>.</p>
348 <h2 id=evil><code>eval</code> is evil</h2>
349 <p>The <code>eval</code> function (and its relatives, <code>Function</code>,
350 <code>setTimeout</code>, and <code>setInterval</code>) provide access
351 to the JavaScript compiler. This is sometimes necessary, but in most cases
352 it indicates the presence of extremely bad coding. The <code>eval</code>
353 function is the most misused feature of JavaScript.</p>
354
355 <h2 id=void><code>void</code></h2>
356 <p>In most C-like languages, <code>void</code> is a type. In
357 JavaScript, <code>void</code> is a prefix operator that always
358 returns <code>undefined</code>. <code>JSLint</code> does not expect to
359 see <code>void</code> because it is confusing and not very useful.</p>
360
361 <h2 id=regexp>Regular Expressions</h2>
362 <p>Regular expressions are written in a terse and cryptic notation. <code>JSLint</code>
363 looks for problems that may cause portability problems. It also attempts
364 to resolve visual ambiguities by recommending explicit escapement.</p>
365 <p>JavaScript's syntax for regular expression literals overloads the <code>/</code>
366 character. To avoid ambiguity, <code>JSLint</code> expects that the character
367 preceding a regular expression literal is a <code>(</code> or <code>=</code>
368 or <code>:</code> or <code>,</code> character. </p>
369 <h2 id=new>Constructors and <code>new</code></h2>
370 <p>Constructors are functions that are designed to be used with the <code>new</code>
371 prefix. The <code>new</code> prefix creates a new object based on the
372 function's <code>prototype</code>, and binds that object to the function's
373 implied <code>this</code> parameter. If you neglect to use the <code>new</code>
374 prefix, no new object will be made and <code>this</code> will be bound
375 to the global object. This is a <a href="http://yuiblog.com/blog/2006/11/13/javascript-we-hardly-new-ya/">serious
376 mistake</a>.</p>
377 <p><code>JSLint</code> enforces the convention that constructor functions
378 be given names with initial uppercase. <code>JSLint</code> does not expect
379 to see a function invocation with an initial uppercase name unless it
380 has the <code>new</code> prefix. <code>JSLint</code> does not expect to
381 see the <code>new</code> prefix used with functions whose names do not
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
382 start with initial uppercase. This can be disabled with the <code>newcap</code>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
383 <a href="#options">option</a>.</p>
384 <p><code>JSLint</code> does not expect to see the wrapper forms <code>new Number</code>,
385 <code>new String</code>, <code>new Boolean</code>. </p>
386 <p><code>JSLint</code> does not expect to see <code>new Object</code> (use <code>{}</code>
387 instead). </p>
388 <p><code>JSLint</code> does not expect to see <code>new Array</code> (use <code>[]</code>
389 instead).</p>
598e67f @douglascrockford /*properties */
authored Jun 28, 2011
390 <h2 id=properties>Properties</h2>
391 <p>Since JavaScript is a loosely-typed, dynamic-object language, it is not
392 possible to determine at compile time if property names are spelled correctly.
393 <code>JSLint</code> provides some assistance with this.</p>
394 <p>At the bottom of its report, <code>JSLint</code> displays a <code>/*properties*/</code>
395 comment. It contains all of the names and string literals that were used
396 with dot notation, subscript notation, and object literals to name the
397 properties of objects. You can look through the list for misspellings. Property
398 names that were only used once are shown in italics. This is to make misspellings
399 easier to spot.</p>
400 <p>You can copy the <code>/*properties*/</code> comment into your script file.
401 <code>JSLint</code> will check the spelling of all property names against
402 the list. That way, you can have <code>JSLint</code> look for misspellings
403 for you. The directive respects function scope.</p>
404 <p>For example,</p>
405 <pre>/*properties
cad15c8 @douglascrockford option.confusion
authored Jan 27, 2012
406 charAt, slice *
598e67f @douglascrockford /*properties */
authored Jun 28, 2011
407 */</pre>
408
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
409 <h2 id=unsafe>Unsafe Characters</h2>
410 <p> There are characters that are handled inconsistently in browsers, and
411 so must be escaped when placed in strings. </p>
412 <pre>\u0000-\u001f
413 \u007f-\u009f
414 \u00ad
415 \u0600-\u0604
416 \u070f
417 \u17b4
418 \u17b5
419 \u200c-\u200f
420 \u2028-\u202f
421 \u2060-\u206f
422 \ufeff
423 \ufff0-\uffff</pre>
424 <h2 id=not>Not Looked For</h2>
425
426 <p><code>JSLint</code> does not do flow analysis to determine that variables are assigned
427 values before used. This is because variables are given a value (<code>undefined</code>)
6735394 @douglascrockford Cleanup.
authored Dec 2, 2010
428 that is a reasonable default for many applications.</p>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
429
430 <p><code>JSLint</code> does not do any kind of global analysis. It does
431 not attempt to determine that functions used with <code>new</code> are
432 really constructors (<a href="#new">except by enforcing capitalization
d4189ff @douglascrockford properties
authored Mar 11, 2011
433 conventions</a>), or that property names are spelled correctly (<a href="#properties">except
434 for matching against the <code>/*properties */</code> comment</a>).</p>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
435 <h2 id=html>HTML</h2>
436 <p><code>JSLint</code> is able to handle HTML text. It can inspect the JavaScript content
437 contained within <code>&lt;script&gt;</code>...<code>&lt;/script&gt;</code> tags. It
438 also inspects the HTML content, looking for problems that are known to interfere
439 with JavaScript:</p>
440 <ul>
441 <li>All tag names must be in lower case.</li>
442 <li>All tags that can take a close tag (such as <code>&lt;/p&gt;</code>)
443 must have a close tag.</li>
444 <li>All tags are correctly nested.</li>
445 <li>The entity <code>&amp;lt;</code> must be used for literal <code>'&lt;'</code>.</li>
446 </ul>
447 <p><code>JSLint</code> is less anal than the sycophantic conformity demanded
448 by XHTML, but more strict than the popular browsers. </p>
449 <p><code>JSLint</code> also checks for the occurrence of<code> '&lt;/' </code>in
450 string literals. You should always write<code> '&lt;\/' </code>instead.
451 The extra backslash is ignored by the JavaScript compiler but not by the
452 HTML parser. Tricks like this should not be necessary, and yet they are.</p>
453 <p>There is a <code>cap</code> <a href="#options">option</a> that allows
44eec74 @douglascrockford Adrian
authored Jun 14, 2011
454 use of uppercase tag names. There is also an <code>on</code> <a href="#options">option</a>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
455 that allows the use of inline HTML event handlers.</p>
456 <p>There is a <code>fragment</code> <a href="#options">option</a> that can
457 inspect a well formed HTML fragment. If the <code>adsafe</code> <a href="#options">option</a>
458 is also used, then the fragment must be a <code>&lt;div&gt;</code> that
459 conforms to the <a href="http://www.ADsafe.org/">ADsafe</a> widget rules.</p>
460 <h2 id=css>CSS</h2>
461 <p><code>JSLint</code> can inspect CSS files. It expects the first line
462 of a CSS file to be </p>
463 <pre>@charset &quot;UTF-8&quot;;</pre>
464 <p>This feature is experimental. Please report any problems or limitations.
465 There is a <code>css</code> <a href="#options">option</a> that will tolerate
598e67f @douglascrockford /*properties */
authored Jun 28, 2011
466 some of the non-standard-but-customary workarounds. </p>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
467
468 <h2 id=options>Options</h2>
469 <p><code>JSLint</code> provides several options that control its operation and
470 its sensitivity. In the <a href="http://www.JSLint.com/">web edition</a>, the
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
471 options are selected with several checkboxes and two fields. </p>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
472 <p>It also provides assistance in constructing <code>/*jslint*/</code>
473 comments.
474 </p>
475 <p>When <code>JSLINT</code> is called as a function, it accepts an <code>option</code> object
476 parameter that allows you to determine the subset of JavaScript that is
477 acceptable to you. The web page version of <code>JSLint</code> at <a href="http://www.JSLint.com/">http://www.JSLint.com/</a>
478 does this for you. </p>
479 <p>Options can also be specified within a script with a <code>/*jslint */</code>
475768b @douglascrockford /*properties*/ and /*global*/ now respect function scope
authored Mar 6, 2011
480 directive:</p>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
481 <pre>/*jslint nomen: true, debug: true,
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
482 evil: false, vars: true */</pre>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
483 <p>An option specification starts with <code>/*jslint</code>. Notice that
484 there is no space before the <code>j</code>. The specification contains
485 a sequence of name value pairs, where the names are <code>JSLint</code>
486 options, and the values are <code>true</code> or <code>false</code>. The
487 <code>indent</code> <a href="#options">option</a> can take a number. A <code>/*jslint */</code>
475768b @douglascrockford /*properties*/ and /*global*/ now respect function scope
authored Mar 6, 2011
488 comment takes precedence over the <code>option</code> object. The directive respects function scope.</p>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
489 <table>
490 <tbody>
491 <tr>
492 <th>Description</th>
493 <th><code>option</code></th>
494 <th>Meaning</th>
495 </tr>
496 <tr>
497 <td>ADsafe</td>
498 <td><code>adsafe</code></td>
499 <td><code>true</code> if <a href="http://www.ADsafe.org/">AD<span style="color: blue;">safe</span></a>
f690208 @douglascrockford adsafe is used with the option object, but not with the /*jslint */ c…
authored Dec 8, 2011
500 rules should be enforced. See <a href="http://www.ADsafe.org/">http://www.ADsafe.org/</a>. <code>adsafe</code> is used with the <code>option</code> object, but not
501 with the <code>/*jslint */</code> comment. </td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
502 </tr>
503 <tr>
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
504 <td>Tolerate bitwise operators </td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
505 <td><code>bitwise</code></td>
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
506 <td><code>true</code> if bitwise operators should be allowed. <a href="#bitwise"><small>(more)</small></a></td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
507 </tr>
508 <tr>
509 <td>Assume a browser </td>
510 <td><code>browser</code></td>
511 <td><code>true</code> if the standard browser globals should be predefined.
512 <a href="#browser"><small>(more)</small></a> </td>
513 </tr>
514 <tr>
515 <td>Tolerate HTML case </td>
516 <td><code>cap</code></td>
44eec74 @douglascrockford Adrian
authored Jun 14, 2011
517 <td><code>true</code> if uppercase HTML should be allowed.</td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
518 </tr>
519 <tr>
3c8016e @douglascrockford option.continue
authored Feb 2, 2011
520 <td>Tolerate <code>continue</code></td>
521 <td><code>continue</code></td>
522 <td><code>true</code> if the <code>continue</code> statement should be allowed.</td>
523 </tr>
524 <tr>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
525 <td>Tolerate CSS workarounds</td>
526 <td><code>css</code></td>
527 <td><code>true</code> if CSS workarounds should be tolerated. <a href="#css"><small>(more)</small></a></td>
528 </tr>
529 <tr>
530 <td>Tolerate debugger statements</td>
531 <td><code>debug</code></td>
532 <td><code>true</code> if <code>debugger</code> statements should be
533 allowed. Set this option to <code>false</code> before going into production.</td>
534 </tr>
535 <tr>
536 <td>Assume <code>console</code>, <code>alert</code>, ...</td>
537 <td><code>devel</code></td>
538 <td><code>true</code> if browser globals that are useful in development should be
ef3710d @douglascrockford more
authored Nov 19, 2011
539 predefined. <small>(<a href="#devel">more</a>)</small></td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
540 </tr>
541 <tr>
ba257de @douglascrockford eqeq
authored Jun 12, 2011
542 <td>Tolerate <code>==</code> and <code>!=</code></td>
543 <td><code>eqeq</code></td>
ef3710d @douglascrockford more
authored Nov 19, 2011
544 <td><code>true</code> if the <code>==</code> and <code>!=</code> operators should be tolerated. <small>(<a href="#eqeq">more</a>)</small></td>
1ebebf3 @douglascrockford cleanup
authored Jul 19, 2011
545 </tr>
ba257de @douglascrockford eqeq
authored Jun 12, 2011
546 <tr>
5675d2c @douglascrockford http://tech.groups.yahoo.com/group/jslint_com/message/1730
authored Jan 7, 2011
547 <td>Tolerate ES5 syntax</td>
548 <td><code>es5</code></td>
1ebebf3 @douglascrockford cleanup
authored Jul 19, 2011
549 <td><code>true</code> if ES5 syntax should be allowed.
550 It is likely that programs using this option will produce syntax errors on ES3 systems.</td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
551 </tr>
552 <tr>
553 <td>Tolerate <code>eval</code> </td>
554 <td><code>evil</code></td>
555 <td><code>true</code> if <code>eval</code> should be allowed. <a href="#evil"><small>(more)</small></a></td>
556 </tr>
557 <tr>
558 <td>Tolerate unfiltered for in </td>
559 <td><code>forin</code></td>
560 <td><code>true</code> if unfiltered <code>for</code> <code>in</code>
561 statements should be allowed. <a href="#forin"><small>(more)</small></a></td>
562 </tr>
563 <tr>
564 <td>Tolerate HTML fragments </td>
565 <td><code>fragment</code></td>
566 <td><code>true</code> if HTML fragments should be allowed. <a href="#html"><small>(more)</small></a></td>
567 </tr>
568 <tr>
5675d2c @douglascrockford http://tech.groups.yahoo.com/group/jslint_com/message/1730
authored Jan 8, 2011
569 <td>Strict white space indentation</td>
570 <td><code>indent</code></td>
4310f67 @douglascrockford indent
authored Aug 6, 2011
571 <td>The number of spaces used for indentation (default is 4).</td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
572 </tr>
573 <tr>
5675d2c @douglascrockford http://tech.groups.yahoo.com/group/jslint_com/message/1730
authored Jan 8, 2011
574 <td>Maximum number of errors</td>
575 <td><code>maxerr</code></td>
0c4a9d6 @douglascrockford .
authored Jun 9, 2011
576 <td>The maximum number of warnings reported. (default is 50)</td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
577 </tr>
578 <tr>
579 <td>Maximum line length</td>
580 <td><code>maxlen</code></td>
0c4a9d6 @douglascrockford .
authored Jun 9, 2011
581 <td>The maximum number of characters in a line.</td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
582 </tr>
583 <tr>
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
584 <td>Tolerate uncapitalized constructors</td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
585 <td><code>newcap</code></td>
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
586 <td><code>true</code> if Initial Caps with constructor
587 functions is optional. <a href="#new"><small>(more)</small></a></td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
588 </tr>
589 <tr>
706c485 @douglascrockford option.node
authored Mar 22, 2011
590 <td>Assume Node.js</td>
591 <td><code>node</code></td>
0c4a9d6 @douglascrockford .
authored Jun 9, 2011
592 <td><code>true</code> if Node.js globals should be predefined. <a href="#node"><small>(more)</small></a></td>
706c485 @douglascrockford option.node
authored Mar 22, 2011
593 </tr>
594 <tr>
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
595 <td>Tolerate dangling _ in identifiers </td>
706c485 @douglascrockford option.node
authored Mar 22, 2011
596 <td><code>nomen</code></td>
0c4a9d6 @douglascrockford .
authored Jun 9, 2011
597 <td><code>true</code> if names should not be checked for initial or trailing underbars.</td>
706c485 @douglascrockford option.node
authored Mar 22, 2011
598 </tr>
599 <tr>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
600 <td>Tolerate HTML event handlers </td>
601 <td><code>on</code></td>
602 <td><code>true</code> if HTML event handlers should be allowed. <a href="#html"><small>(more)</small></a></td>
603 </tr>
604 <tr>
605 <td>Stop on first error </td>
606 <td><code>passfail</code></td>
607 <td><code>true</code> if the scan should stop on first error.</td>
608 </tr>
609 <tr>
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
610 <td>Tolerate <code>++</code> and <code>--</code> </td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
611 <td><code>plusplus</code></td>
612 <td><code>true</code> if <code>++</code> and <code>--</code> should
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
613 be allowed. <a href="#inc"><small>(more)</small></a></td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
614 </tr>
615 <tr>
616 <td>Predefined <small>( , separated)</small></td>
617 <td><code>predef</code></td>
6735394 @douglascrockford Cleanup.
authored Dec 2, 2010
618 <td>An array of strings, the names of predefined global variables, or an object whose keys are global variable names, and whose values are booleans that determine if each variable is assignable (also see <a href="#global">global</a>). <code>predef</code> is used with the <code>option</code> object, but not
00d8d1f @douglascrockford option.predef
authored Dec 2, 2010
619 with the <code>/*jslint */</code> comment. You can also use the <code>var</code>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
620 statement to declare global variables in a script file.</td>
621 </tr>
622 <tr>
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
623 <td>Tolerate <code>.</code> and <code>[^</code>...<code>]</code>. in /RegExp/ </td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
624 <td><code>regexp</code></td>
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
625 <td><code>true</code> if <code>.</code> and <code>[^</code>...<code>]</code> should be allowed in RegExp
8d1c4eb @douglascrockford clarification
authored Jan 10, 2011
626 literals. They match more material than might be expected, allowing attackers to confuse applications. These forms should not be used when validating in secure applications. </td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
627 </tr>
628 <tr>
629 <td>Assume Rhino </td>
630 <td><code>rhino</code></td>
631 <td><code>true</code> if the <a href="http://www.mozilla.org/rhino/">Rhino</a>
632 environment globals should be predefined. <a href="#rhino"><small>(more)</small></a></td>
633 </tr>
634 <tr>
635 <td>Safe Subset </td>
636 <td><code>safe</code></td>
637 <td><code>true</code> if the safe subset rules are enforced. These rules
638 are used by <a href="http://www.ADsafe.org/">ADsafe</a>. It enforces
f690208 @douglascrockford adsafe is used with the option object, but not with the /*jslint */ c…
authored Dec 8, 2011
639 the safe subset rules but not the widget structure rules. <code>safe</code> is used with the <code>option</code> object, but not
640 with the <code>/*jslint */</code> comment. </td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
641 </tr>
642 <tr>
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
643 <td> Tolerate missing&nbsp;<code>'use strict'</code>&nbsp;pragma </td>
644 <td><code>sloppy</code></td>
645 <td><code>true</code> if the ES5 <code><a href="http://www.yuiblog.com/blog/2010/12/14/strict-mode-is-coming-to-town/">'use strict';</a></code> pragma
0c4a9d6 @douglascrockford .
authored Jun 9, 2011
646 is not required. Do not use this pragma unless you know what you are doing.</td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
647 </tr>
648 <tr>
649 <td>Tolerate inefficient subscripting<br>
650 </td>
651 <td><code>sub</code></td>
652 <td><code>true</code> if subscript notation may be used for expressions
653 better expressed in dot notation.</td>
654 </tr>
655 <tr>
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
656 <td> Tolerate misordered definitions </td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
657 <td><code>undef</code></td>
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
658 <td><code>true</code> if variables and functions need not be declared before used. <a href="#undefined"><small>(more)</small></a></td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
659 </tr>
660 <tr>
0b060c1 @douglascrockford unparam
authored Jun 9, 2011
661 <td> Tolerate unused parameters</td>
662 <td><code>unparam</code></td>
0c4a9d6 @douglascrockford .
authored Jun 9, 2011
663 <td><code>true</code> if warnings should not be given for unused parameters.</td>
0b060c1 @douglascrockford unparam
authored Jun 9, 2011
664 </tr>
665 <tr>
666 <td>Tolerate many&nbsp;<tt>var</tt>&nbsp;statements per function</td>
667 <td><code>vars</code></td>
668 <td><code>true</code> if multiple <code>var</code> statement per function
669 should be allowed. <a href="#scope"><small>(more)</small></a></td>
670 </tr>
671 <tr>
a27d17c @douglascrockford Tolerate
authored Jun 9, 2011
672 <td> Tolerate messy white space</td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
673 <td><code>white</code></td>
0b060c1 @douglascrockford unparam
authored Jun 9, 2011
674 <td><code>true</code> if strict whitespace rules should be ignored.</td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
675 </tr>
676 <tr>
677 <td>Assume a Yahoo Widget </td>
678 <td><code>widget</code></td>
679 <td><code>true</code> if the <a href="http://widgets.yahoo.com/gallery/view.php?widget=37484">Yahoo
680 Widgets</a> globals should be predefined. <a href="#widget"><small>(more)</small></a></td>
681 </tr>
682 <tr>
0b060c1 @douglascrockford unparam
authored Jun 9, 2011
683 <td>Assume Windows</td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
684 <td><code>windows</code></td>
1ebebf3 @douglascrockford cleanup
authored Jul 19, 2011
685 <td><code>true</code> if the Windows globals should be predefined. <a href="#windows"><small>(more)</small></a></td>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
686 </tr>
687 </tbody>
688 </table>
689 <h2 id=report>Report</h2>
690
691 <p>If <code>JSLint</code> is able to complete its scan, it generates a function
692 report. It lists for each function:</p>
693
694 <ul>
695 <li>The line number on which it starts.</li>
696 <li>Its name. In the case of anonymous functions, <code>JSLint</code>
0c4a9d6 @douglascrockford .
authored Jun 9, 2011
697 will 'guess' the name.</li>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
698 <li>The parameters.</li>
699 <li><i>Closure</i>: The variables and parameters that are declared in
700 the function that are used by its inner functions.</li>
701 <li><i>Variables</i>: The variables that are declared in the function
702 that are used only by the function.</li>
703 <li><i>Exceptions</i>: The variables that are declared by try statements.</li>
704 <li><i>Unused</i>: The variables that are declared in the function that
705 are not used. This may be an indication of an error.</li>
706 <li><i>Outer</i>: Variables used by this function that are declared in
707 another function.</li>
708 <li><i>Global</i>: Global variables that are used by this function. Keep
709 these to a minimum.</li>
710 <li><i>Label</i>: Statement labels that are used by this function.</li>
711 </ul>
d4189ff @douglascrockford properties
authored Mar 11, 2011
712 <p>The report will also include a list of all of the <a href="#properties">property
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
713 names</a> that were used. There is a <a href="msgs.html">list of <code>JSLint</code>
714 messages</a>.</p>
715 <h2 id=feedback>Feedback</h2>
716 <p>Please let me know if <code>JSLint</code> is useful for you. Is it too
717 strict? Is there a check or a report that could help you to improve the
eec32d4 @douglascrockford But please
authored Dec 22, 2011
718 quality of your programs?
719 <a href="mailto:douglas@crockford.com">douglas@crockford.com</a>.
720 But please don't ask me to dumb <code>JSLint</code> down or to make it more
721 forgiving of bad practices. You would only be disappointed.</p>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
722 <p>I intend to continue to adapt <code>JSLint</code> based on your comments.
eec32d4 @douglascrockford But please
authored Dec 22, 2011
723 Keep watching for improvements. Updates are announced at
724 <a href="http://tech.groups.yahoo.com/group/jslint_com/">http://tech.groups.yahoo.com/group/jslint_com/</a>. </p>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
725
726 <h2 id=try>Try it</h2>
727
728 <p><a href="http://www.JSLint.com" target="_blank">Try it.</a> Paste your script
729 into the window and click the
730 <a href="http://www.JSLint.com" target=jslint><input type="button" value="JSLint"></a>
731 button. The analysis is done by a script running on your machine.
598e67f @douglascrockford /*properties */
authored Jun 28, 2011
732 Your script is not sent over the network. You can set the <a href="#options">options</a> used. </p>
bdd3576 @douglascrockford k
authored Dec 8, 2010
733 <p>
734 JSLint is written entirely in JavaScript, so it can run anywhere that JavaScript can run. See for example <a href="http://tech.groups.yahoo.com/group/jslint_com/database?method=reportRows&tbl=1">http://tech.groups.yahoo.com/group/jslint_com/database?method=reportRows&amp;tbl=1</a>.</p>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
735 <h2 id=implementation>Implementation</h2>
736 <p><code>JSLint</code> uses a <a href="http://javascript.crockford.com/tdop/tdop.html">Pratt
737 Parser (Top Down Operator Precedence)</a>. It is written in JavaScript.
35ec4a5 @douglascrockford groove
authored Nov 18, 2010
738 The full source code is available: <a href="https://github.com/douglascrockford/JSLint">https://github.com/douglascrockford/JSLint</a>.</p>
ca120a7 @douglascrockford first commit
authored Nov 12, 2010
739 <a href="http://www.JSLint.com/"><img src="jslintpill.gif" width="36" height="17" border="0"></a>
740 <a href="http://www.ADsafe.org/"><img src="adsafepill.gif" width="36" height="17" border="0"></a>
741 <a href="http://www.JSON.org/"><img src="jsonpill.gif" width="36" height="17" border="0"></a>
742 </body>
743 </html>
Something went wrong with that request. Please try again.