Seleccionar página

Configuración de JSHint

jshint

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
/* jshint option: true||false */
Indica que a continuación se incluyen directivas de configuración de JSHint.
// jshint option: numero
Establece un valor para alguna de las opciones de JSHint.
/* jslint option: true||false */
Indica que a continuación se incluyen directivas de configuración de JSLint de Douglas Crockford.
/* global VARIABLE: true||false */
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.
/* global -VARIABLE */
Indica que la variable global ya no será utilizada en el resto del programa.
/* exported EXPORTED_VAR */
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
asi: true
Elimina los avisos sobre la falta de punto y coma al final de las instrucciones.
bitwise: true
Prohíbe las operaciones a nivel de bit como ^ (XOR), | (OR) u otros.
boss: true
Elimina los avisos sobre las asignaciones = en los casos donde se esperaba una comparación == o ===.
browser: true
Define los objetos globales expuestos por los navegadores.
browserify: true
Define los objetos globales expuestos por Browserify.
camelcase: true
Prohíbe los identificadores que no sigan el estilo camelCase o UPPER_CASE.
couch: true
Define los objetos globales expuestos por la base de datos CouchDB.
curly: true
Prohíbe la eliminación de los corchetes { } de las instrucciones condicionales y bucles.
debug: true
Elimina los avisos sobre la instrucción debugger que pueda aparecer en el código.
devel: true
Define los objetos globales relacionados con la traza de código (console, alert, etc.).
dojo: true
Define los objetos globales expuestos por Dojo Toolkit.
elision: true
Indica que se usan elementos vacios en las matrices del tipo [1,,,,5,6].
eqeqeq: true
Prohíbe el uso de == y != y obliga a utilizar === y !==.
eqnull: true
Elimina los avisos sobre las comparaciones ==null
es3: true
Fuerza la compatibilidad con la especificación ECMAScript 3. Por defecto se utiliza la especificación EMACScript 5.
es5: true
Fuerza la compatibilidad con la especificación ECMAScript 5.1.
esnext: true
Fuerza la compatibilidad con la especificación ECMAScript 6.
evil: true
Elimina los avisos sobre el uso de eval.
expr: true
Elimina los avisos sobre expresiones que pueden ser confundidas con llamadas a funciones o asignaciones.
forin: true
Prohíbe bucles for key in obj sin una comprobación de los miembros del objeto por medio obj.hasOwnProperty(key).
freeze: true
Prohíbe sobreescribir los prototipos de objectos predefinidos como Array, Date, etc..
funcscope: true
Elimina los avisos sobre el uso de variables definidas dentro de una estructura de control y utilizadas posteriormente fuera de esta.
futurehostile: true
Activa advertencias sobre el uso de funcionalidades que se definirán en las futuras versiones de JavaScript.
gcl: true
Permite la compatibilidad con Google Closure Linter. (Incluido en la versión 1.1.0)
globalstrict: true
Elimina los avisos sobre el uso de "strict mode" a nivel global.
immed: true
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).
iterator: true
Elimina los avisos por el uso de la propiedad __iterator__.
jasmine: true
Define los objetos globales expuestos por Jasmine.
jquery: true
Define los objetos globales expuestos por JQuery.
lastsemic: true
Elimina los avisos por omitir el punto y coma en sentencias incluidas en bloques de una sola linea.
latedef: true
Prohíbe el uso de una varible antes de su definición.
laxbreak: true
Elimina los avisos por posibles saltos de línea no seguros (deprecado).
laxcomma: true
Elimina los avisos por el uso de la coma como primer carácter de la línea de código (deprecado).
loopfunc: true
Elimina los avisos por la definición de funciones dentro de bucles.
maxerr: numero
Establece el número máximo de errores de JSHint antes de abandonar.
maxcomplexity: numero
Controla la complejidad ciclomática del codigo.
maxparams: numero
Establece el número máximo de declaraciones en el código.
maxstatements: numero
Establece el número máximo de parámetros de las funciones.
mocha: true
Define los objetos globales expuestos por Mocha.
module: true
Identifica la ejecucción de un módulo de ECMAScript 6.
mootools: true
Define los objetos globales expuestos por MooTools.
moz: true
Permite la utilización de las extensiones de Mozilla Javascript.
multistr: true
Elimina los avisos por cadenas de caracteres de varias líneas.
newcap: true
Prohíbe el uso de new con constructores que no empiecen con mayúscula.
noarg: true
Prohíbe el uso de arguments.caller y arguments.callee.
nocomma: true
Prohíbe el uso del operador coma (,).
node: true
Define los objetos globales expuestos por NodeJS.
noempty: true
Prohíbe bloques { } si código (deprecado).
nonew: true
Prohíbe el uso de new sin asignar el resultado a una variable.
nonstandard: true
Elimina los avisos por el uso de funciones no estándar, pero ampliamente aceptadas como escape y unescape.
nomen: true
Prohíbe el uso de _ como inicio del nombre de las variables.
notypeof: true
Elimina los avisos por el uso de valores inválidos con typeof.
onevar: true
Prohíbe el uso de más de una instrucción var por función.
passfail: true
Detiene el uso de JSHint en el primer error que se encuentre.
phantom: true
Permite el uso de PhantomJS.
plusplus: true
Prohíbe el uso de ++ y -- para incrementar y reducir el valor de las variables.
proto: true
Elimina los avisos por la utilización de la propiedad __proto__.
prototypejs: true
Define los objetos globales expuestos por Prototype y Scriptaculous.
rhino: true
Define los objetos expuestos por Rhino.
shelljs: true
Define los objetos expuestos por ShellJS
scripturl: true
Elimina los avisos por utilizar javascript: ... como URL.
singleGroups: true
Prohíbe el uso de paréntesis que no son necesarios.
shadow: true
Elimina los avisos por volver a definir variables ya definidas.
smarttabs: true
Elimina los avisos por utilizar una combinación de tabuladores y espacios cuando estos últimos son utilizados para alinear los elementos (smarttabs)
strict: true
Exige que todas las funciones se ejecuten bajo la instrucción "use strict".
sub: true
Elimina los avisos cuando se utiliza objeto["propiedad"] y es posible utilizar la notación con puntos objeto.propiedad.
supernew: true
Elimina los avisos cuando se utiliza new function () { ... }; y new Object;.
trailing: true
Prohíbe dejar espacios en blanco detrás del código.
typed: true
Define como globales los typed array.
undef: true
Prohíbe el uso de variables no definidas anteriormente.
unused: true
Produce un aviso cuando no se utiliza una variable definida.
validthis: true
Elimina los avisos cuando el código se ejecuta en strict mode y se usa this fuera de un constructor.
varstmt: true
Prohíbe el uso de var, pudiendo usarse sólo let y const.
withstmt: true
Elimina los avisos cuando se usa la instrucción with.
white: true
Esta opción hace que JSHint compruebe que se está utilizando el estilo de código establecido por Douglas Crockford.
worker: true
Define los objetos globales relacionados con Web Worker.
wsh: true
Define los objetos globales expuestos por Windows Script Host.
yui: true
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
W001
'hasOwnProperty' is a really bad name.
W002
Value of 'X' may be overwritten in IE 8 and earlier.
W003
'X' was used before it was defined.
W004
'X' is already defined.
W005
A dot following a number can be confused with a decimal point.
W006
Confusing minuses.
W007
Confusing pluses.
W008
A leading decimal point can be confused with a dot: 'X'.
W009
The array literal notation [] is preferrable.
W010
The object literal notation {} is preferrable.
W011
Unexpected space after 'X'.
W012
Unexpected space before 'X'.
W013
Missing space after 'X'.
W014
Bad line breaking before 'X'.
W015
Expected 'X' to have an indentation at Y instead at Z.
W016
Unexpected use of 'X'.
W017
Bad operand.
W018
Confusing use of 'X'.
W019
Use the isNaN function to compare with NaN.
W020
Read only.
W021
'X' is a function.
W022
Do not assign to the exception parameter.
W023
Expected an identifier in an assignment and instead saw a function invocation.
W024
Expected an identifier and instead saw 'X' (a reserved word).
W025
Missing name in function declaration.
W026
Inner functions should be listed at the top of the outer function.
W027
Unreachable 'X' after 'Y'.
W028
Label 'X' on Y statement.
W030
Expected an assignment or function call and instead saw an expression.
W031
Do not use 'new' for side effects.
W032
Unnecessary semicolon.
W033
Missing semicolon.
W034
Unnecessary directive "X".
W035
Empty block.
W036
Unexpected /*member 'X'.
W037
'X' is a statement label.
W038
'X' used out of scope.
W039
'X' is not allowed.
W040
Possible strict violation.
W041
Use 'X' to compare with 'Y'.
W042
Avoid EOL escaping.
W043
Bad escaping of EOL. Use option multistr if needed.
W044
Bad or unnecessary escaping.
W045
Bad number 'X'.
W046
Don't use extra leading zeros 'X'.
W047
A trailing decimal point can be confused with a dot: 'X'.
W048
Unexpected control character in regular expression.
W049
Unexpected escaped character 'X' in regular expression.
W050
JavaScript URL.
W051
Variables should not be deleted.
W052
Unexpected 'X'.
W053
Do not use X as a constructor.
W054
The Function constructor is a form of eval.
W055
A constructor name should start with an uppercase letter.
W056
Bad constructor.
W057
Weird construction. Is 'new' unnecessary?
W058
Missing '()' invoking a constructor.
W059
Avoid arguments.X.
W060
document.write can be a form of eval.
W061
eval can be harmful.
W062
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.
W063
Math is not a function.
W064
Missing 'new' prefix when invoking a constructor.
W065
Missing radix parameter.
W066
Implied eval. Consider passing a function instead of a string.
W067
Bad invocation.
W068
Wrapping non-IIFE function literals in parens is unnecessary.
W069
['X'] is better written in dot notation.
W070
Extra comma. (it breaks older versions of IE)
W071
This function has too many statements. (X)
W072
This function has too many parameters. (X)
W073
Blocks are nested too deeply. (X)
W074
This function's cyclomatic complexity is too high. (X)
W075
Duplicate key 'X'.
W076
Unexpected parameter 'X' in get Y function.
W077
Expected a single parameter in set X function.
W078
Setter is defined without getter.
W079
Redefinition of 'X'.
W080
It's not necessary to initialize 'X' to 'undefined'.
W081
Too many var statements.
W082
Function declarations should not be placed in blocks. Use a function expression or move the statement to the top of the outer function.
W083
Don't make functions within a loop.
W084
Expected a conditional expression and instead saw an assignment.
W085
Don't use 'with'.
W086
Expected a 'break' statement before 'X'.
W087
Forgotten 'debugger' statement?
W088
Creating global 'for' variable. Should be 'for (var X …'.
W089
The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype.
W090
'X' is not a statement label.
W091
'X' is out of scope.
W092
Wrap the /regexp/ literal in parens to disambiguate the slash operator.
W093
Did you mean to return a conditional instead of an assignment?
W094
Unexpected comma.
W095
Expected a string and instead saw X.
W096
The 'X' key may produce unexpected results.
W097
Use the function form of "use strict".
W098
'X' is defined but never used.
W099
Mixed spaces and tabs.
W100
This character may get silently deleted by one or more browsers.
W101
Line is too long.
W102
Trailing whitespace.
W103
The 'X' property is deprecated.
W104
'X' is only available in JavaScript 1.7.
W105
Unexpected X in 'Y'.
W106
Identifier 'X' is not in camel case.
W107
Script URL.
W108
Strings must use doublequote.
W109
Strings must use singlequote.
W110
Mixed double and single quotes.
W112
Unclosed string.
W113
Control character in string: X.
W114
Avoid X.
W115
Octal literals are not allowed in strict mode.
W116
Expected 'X' and instead saw 'Y'.
W117
'X' is not defined.
W118
'X' is only available in Mozilla JavaScript extensions (use moz option).
W119
'X' is only available in ES6 (use esnext option).
W120
You might be leaking a variable (X) here.
W121
Extending prototype of native object: 'X'.
W122
Invalid typeof value 'X'.
W123
‘{a}’ is already defined in outer scope.
W124
A generator function shall contain a yield statement.
W125
This line contains non-breaking spaces: http://jshint.com/doc/options/#nonbsp
W126
Unnecessary grouping operator.
W127
Unexpected use of a comma operator.
W128
Empty array elements require elision=true.
W129
X is defined in a future version of JavaScript. Use a different variable name to avoid migration issues.
W130
Invalid element after rest element.
W131
Invalid parameter after rest parameter.
W132
`var` declarations are forbidden. Use `let` or `const` instead.
W133
Invalid for-{a} loop left-hand-side: Y.
W13
The X option is only available when linting ECMAScript Y code.
W135
{a} may not be supported by non-browser environments.
W136
X must be in function scope.
W137
Empty destructuring.
W138
Regular parameters should not come after default parameters