Instalación
JSHint se puede usar online en jshint.com y se puede consultar la documentación en http://jshint.com/docs/.
Para utilizar JSHint en nuestro equipo se puede instalar como una paquete Node.JS utilizando npm con la instrucción:
npm install jshint -g
Una vez instalado en ese puede utilizar con:
jshint fichero.js
Configuración
Para configurar JSHint se puede crear un fichero de este tipo:
{
"undef": true,
"unused": true,
"globals": { "MY_GLOBAL": false }
}
Este fichero se utiliza con la opción --config
o lo guardamos con el nombre .jshintrc
.
Es posible configurarlo en el fichero package.json
en la propiead jshintConfig
.
También se puede configurar JSHint indicando los parámetros con comentarios Javascript de este tipo:
/* jshint undef: true, unused: true */
Estos comentarios pueden contener los siguientes formatos:
Opción | Descripción |
---|---|
| Indica que a continuación se incluyen directivas de configuración de JSHint. |
| Establece un valor para alguna de las opciones de JSHint. |
| Indica que a continuación se incluyen directivas de configuración de JSLint de Douglas Crockford. |
| Indica que a continuación se incluyen variables globales definidas en otro contexto. Si el valor es false indica que la variable es de sólo lectura. |
| Indica que la variable global ya no será utilizada en el resto del programa. |
| Indica que la variable global es definida en este programa, pero es usada en otro, por lo que no se utiliza localmente. |
Es posible desactivar JSHint y volverlo activar por medio de dos comentarios:
/* jshint ignore:start */
...
/* jshint ignore:end */
Si sólo queremos desactivar en una determinada linea, es posible utilizar este formato:
... // jshint ignore:line
Opciones de configuración
Opción | Descripción |
---|---|
| Elimina los avisos sobre la falta de punto y coma al final de las instrucciones. |
| Prohíbe las operaciones a nivel de bit como ^ (XOR), | (OR) u otros. |
| Elimina los avisos sobre las asignaciones = en los casos donde se esperaba una comparación == o === . |
| Define los objetos globales expuestos por los navegadores. |
| Define los objetos globales expuestos por Browserify. |
| Prohíbe los identificadores que no sigan el estilo camelCase o UPPER_CASE. |
| Define los objetos globales expuestos por la base de datos CouchDB. |
| Prohíbe la eliminación de los corchetes { } de las instrucciones condicionales y bucles. |
| Elimina los avisos sobre la instrucción debugger que pueda aparecer en el código. |
| Define los objetos globales relacionados con la traza de código (console , alert , etc.). |
| Define los objetos globales expuestos por Dojo Toolkit. |
| Indica que se usan elementos vacios en las matrices del tipo [1,,,,5,6] . |
| Prohíbe el uso de == y != y obliga a utilizar === y !== . |
| Elimina los avisos sobre las comparaciones ==null |
| Fuerza la compatibilidad con la especificación ECMAScript 3. Por defecto se utiliza la especificación EMACScript 5. |
| Fuerza la compatibilidad con la especificación ECMAScript 5.1. |
| Fuerza la compatibilidad con la especificación ECMAScript 6. |
| Elimina los avisos sobre el uso de eval . |
| Elimina los avisos sobre expresiones que pueden ser confundidas con llamadas a funciones o asignaciones. |
| Prohíbe bucles for key in obj sin una comprobación de los miembros del objeto por medio obj.hasOwnProperty(key) . |
| Prohíbe sobreescribir los prototipos de objectos predefinidos como Array, Date, etc.. |
| Elimina los avisos sobre el uso de variables definidas dentro de una estructura de control y utilizadas posteriormente fuera de esta. |
| Activa advertencias sobre el uso de funcionalidades que se definirán en las futuras versiones de JavaScript. |
| Permite la compatibilidad con Google Closure Linter. (Incluido en la versión 1.1.0) |
| Elimina los avisos sobre el uso de "strict mode" a nivel global. |
| Prohíbe la llamada inmediata a una función sin el uso de paréntesis que indiquen con claridad que se la expresión es el resultado de la llamada a una función y no una función como tal (deprecado). |
| Elimina los avisos por el uso de la propiedad __iterator__ . |
| Define los objetos globales expuestos por Jasmine. |
| Define los objetos globales expuestos por JQuery. |
| Elimina los avisos por omitir el punto y coma en sentencias incluidas en bloques de una sola linea. |
| Prohíbe el uso de una varible antes de su definición. |
| Elimina los avisos por posibles saltos de línea no seguros (deprecado). |
| Elimina los avisos por el uso de la coma como primer carácter de la línea de código (deprecado). |
| Elimina los avisos por la definición de funciones dentro de bucles. |
| Establece el número máximo de errores de JSHint antes de abandonar. |
| Controla la complejidad ciclomática del codigo. |
| Establece el número máximo de declaraciones en el código. |
| Establece el número máximo de parámetros de las funciones. |
| Define los objetos globales expuestos por Mocha. |
| Identifica la ejecucción de un módulo de ECMAScript 6. |
| Define los objetos globales expuestos por MooTools. |
| Permite la utilización de las extensiones de Mozilla Javascript. |
| Elimina los avisos por cadenas de caracteres de varias líneas. |
| Prohíbe el uso de new con constructores que no empiecen con mayúscula. |
| Prohíbe el uso de arguments.caller y arguments.callee . |
| Prohíbe el uso del operador coma (,). |
| Define los objetos globales expuestos por NodeJS. |
| Prohíbe bloques { } si código (deprecado). |
| Prohíbe el uso de new sin asignar el resultado a una variable. |
| Elimina los avisos por el uso de funciones no estándar, pero ampliamente aceptadas como escape y unescape . |
| Prohíbe el uso de _ como inicio del nombre de las variables. |
| Elimina los avisos por el uso de valores inválidos con typeof . |
| Prohíbe el uso de más de una instrucción var por función. |
| Detiene el uso de JSHint en el primer error que se encuentre. |
| Permite el uso de PhantomJS. |
| Prohíbe el uso de ++ y -- para incrementar y reducir el valor de las variables. |
| Elimina los avisos por la utilización de la propiedad __proto__ . |
| Define los objetos globales expuestos por Prototype y Scriptaculous. |
| Define los objetos expuestos por Rhino. |
| Define los objetos expuestos por ShellJS |
| Elimina los avisos por utilizar javascript: ... como URL. |
| Prohíbe el uso de paréntesis que no son necesarios. |
| Elimina los avisos por volver a definir variables ya definidas. |
| Elimina los avisos por utilizar una combinación de tabuladores y espacios cuando estos últimos son utilizados para alinear los elementos (smarttabs) |
| Exige que todas las funciones se ejecuten bajo la instrucción "use strict" . |
| Elimina los avisos cuando se utiliza objeto["propiedad"] y es posible utilizar la notación con puntos objeto.propiedad . |
| Elimina los avisos cuando se utiliza new function () { ... }; y new Object; . |
| Prohíbe dejar espacios en blanco detrás del código. |
| Define como globales los typed array. |
| Prohíbe el uso de variables no definidas anteriormente. |
| Produce un aviso cuando no se utiliza una variable definida. |
| Elimina los avisos cuando el código se ejecuta en strict mode y se usa this fuera de un constructor. |
| Prohíbe el uso de var , pudiendo usarse sólo let y const . |
| Elimina los avisos cuando se usa la instrucción with . |
| Esta opción hace que JSHint compruebe que se está utilizando el estilo de código establecido por Douglas Crockford. |
| Define los objetos globales relacionados con Web Worker. |
| Define los objetos globales expuestos por Windows Script Host. |
| Define los objetos globales expuestos por YUI. |
Avisos
Una característica interesante de JSHint es la gestión de avisos. Si queremos incluir una característica en nuestro código a sabiendas que producirá un aviso con este analizador estático, podemos utilizar el siguiente comentario para desactivarlo:
/* jshint -W034 */
Tras las instrucciones que producen este aviso es conveniente volver a activarlo para evitar problemas no deseados:
/* jshint +W034 */
Los errores no pueden ser desactivados por este método y deberemos usar las opciones de configuración para activarlos y desactivarlos.
Esta es la lista de los avisos que ahora mismo son gestionados por JSHint (hemos dejado los textos en inglés para que sea más fácil localizar los mensajes):
Código | Mensaje |
---|---|
| 'hasOwnProperty' is a really bad name. |
| Value of 'X' may be overwritten in IE 8 and earlier. |
| 'X' was used before it was defined. |
| 'X' is already defined. |
| A dot following a number can be confused with a decimal point. |
| Confusing minuses. |
| Confusing pluses. |
| A leading decimal point can be confused with a dot: 'X'. |
| The array literal notation [] is preferrable. |
| The object literal notation {} is preferrable. |
| Unexpected space after 'X'. |
| Unexpected space before 'X'. |
| Missing space after 'X'. |
| Bad line breaking before 'X'. |
| Expected 'X' to have an indentation at Y instead at Z. |
| Unexpected use of 'X'. |
| Bad operand. |
| Confusing use of 'X'. |
| Use the isNaN function to compare with NaN. |
| Read only. |
| 'X' is a function. |
| Do not assign to the exception parameter. |
| Expected an identifier in an assignment and instead saw a function invocation. |
| Expected an identifier and instead saw 'X' (a reserved word). |
| Missing name in function declaration. |
| Inner functions should be listed at the top of the outer function. |
| Unreachable 'X' after 'Y'. |
| Label 'X' on Y statement. |
| Expected an assignment or function call and instead saw an expression. |
| Do not use 'new' for side effects. |
| Unnecessary semicolon. |
| Missing semicolon. |
| Unnecessary directive "X". |
| Empty block. |
| Unexpected /*member 'X'. |
| 'X' is a statement label. |
| 'X' used out of scope. |
| 'X' is not allowed. |
| Possible strict violation. |
| Use 'X' to compare with 'Y'. |
| Avoid EOL escaping. |
| Bad escaping of EOL. Use option multistr if needed. |
| Bad or unnecessary escaping. |
| Bad number 'X'. |
| Don't use extra leading zeros 'X'. |
| A trailing decimal point can be confused with a dot: 'X'. |
| Unexpected control character in regular expression. |
| Unexpected escaped character 'X' in regular expression. |
| JavaScript URL. |
| Variables should not be deleted. |
| Unexpected 'X'. |
| Do not use X as a constructor. |
| The Function constructor is a form of eval. |
| A constructor name should start with an uppercase letter. |
| Bad constructor. |
| Weird construction. Is 'new' unnecessary? |
| Missing '()' invoking a constructor. |
| Avoid arguments.X. |
| document.write can be a form of eval. |
| eval can be harmful. |
| Wrap an immediate function invocation in parens to assist the reader in understanding that the expression is the result of a function, and not the function itself. |
| Math is not a function. |
| Missing 'new' prefix when invoking a constructor. |
| Missing radix parameter. |
| Implied eval. Consider passing a function instead of a string. |
| Bad invocation. |
| Wrapping non-IIFE function literals in parens is unnecessary. |
| ['X'] is better written in dot notation. |
| Extra comma. (it breaks older versions of IE) |
| This function has too many statements. (X) |
| This function has too many parameters. (X) |
| Blocks are nested too deeply. (X) |
| This function's cyclomatic complexity is too high. (X) |
| Duplicate key 'X'. |
| Unexpected parameter 'X' in get Y function. |
| Expected a single parameter in set X function. |
| Setter is defined without getter. |
| Redefinition of 'X'. |
| It's not necessary to initialize 'X' to 'undefined'. |
| Too many var statements. |
| Function declarations should not be placed in blocks. Use a function expression or move the statement to the top of the outer function. |
| Don't make functions within a loop. |
| Expected a conditional expression and instead saw an assignment. |
| Don't use 'with'. |
| Expected a 'break' statement before 'X'. |
| Forgotten 'debugger' statement? |
| Creating global 'for' variable. Should be 'for (var X …'. |
| The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype. |
| 'X' is not a statement label. |
| 'X' is out of scope. |
| Wrap the /regexp/ literal in parens to disambiguate the slash operator. |
| Did you mean to return a conditional instead of an assignment? |
| Unexpected comma. |
| Expected a string and instead saw X. |
| The 'X' key may produce unexpected results. |
| Use the function form of "use strict". |
| 'X' is defined but never used. |
| Mixed spaces and tabs. |
| This character may get silently deleted by one or more browsers. |
| Line is too long. |
| Trailing whitespace. |
| The 'X' property is deprecated. |
| 'X' is only available in JavaScript 1.7. |
| Unexpected X in 'Y'. |
| Identifier 'X' is not in camel case. |
| Script URL. |
| Strings must use doublequote. |
| Strings must use singlequote. |
| Mixed double and single quotes. |
| Unclosed string. |
| Control character in string: X. |
| Avoid X. |
| Octal literals are not allowed in strict mode. |
| Expected 'X' and instead saw 'Y'. |
| 'X' is not defined. |
| 'X' is only available in Mozilla JavaScript extensions (use moz option). |
| 'X' is only available in ES6 (use esnext option). |
| You might be leaking a variable (X) here. |
| Extending prototype of native object: 'X'. |
| Invalid typeof value 'X'. |
| ‘{a}’ is already defined in outer scope. |
| A generator function shall contain a yield statement. |
| This line contains non-breaking spaces: http://jshint.com/doc/options/#nonbsp |
| Unnecessary grouping operator. |
| Unexpected use of a comma operator. |
| Empty array elements require elision=true. |
| X is defined in a future version of JavaScript. Use a different variable name to avoid migration issues. |
| Invalid element after rest element. |
| Invalid parameter after rest parameter. |
| `var` declarations are forbidden. Use `let` or `const` instead. |
| Invalid for-{a} loop left-hand-side: Y. |
| The X option is only available when linting ECMAScript Y code. |
| {a} may not be supported by non-browser environments. |
| X must be in function scope. |
| Empty destructuring. |
| Regular parameters should not come after default parameters |