JSHint y jQuery: '$' no está definido


215

El siguiente JS:

(function() {
  "use strict";

  $("#target").click(function(){
    console.log("clicked");
  });

}());

Rendimientos:

test.js: line 5, col 3, '$' is not defined.

Cuando se alinea usando JSHint 0.5.5. ¿Algunas ideas?


¿Has añadido jquery.jsa tu página?
Rory McCrossan

44
Bueno, si lo alimenta solo ese código por sí mismo, no $ está definido.
Puntiagudo

Tengo este problema en angular. Simplemente cambie $ a angular.element y jshint no warn
Raphael Vitor el

Respuestas:


381

Si está utilizando una versión relativamente reciente de JSHint, el enfoque generalmente preferido es crear un archivo .jshintrc en la raíz de su proyecto y poner esta configuración en él:

{
    "globals": {
        "$": false
    }
}

Esto declara a JSHint que $ es una variable global, y el falso indica que no debe anularse.

El archivo .jshintrc no era compatible con versiones realmente antiguas de JSHint (como v0.5.5 como la pregunta original en 2012). Si no puede o no quiere usar el archivo .jshintrc, puede agregar esto en la parte superior del archivo de script:

/*globals $:false */

También hay una opción abreviada "jquery" jshint como se ve en la página de opciones de JSHint .


47
Esta opción, jquery, simplemente define dos variables globales de solo lectura: $ y jQuery. Es una versión más corta de /*global $:false, jQuery:false */.
Anton Kovalyov el

1
Con mi JSHint para Visual Studio, la opción se llama "asumir jQuery"
Jowen

2
El indicador de opción es el camino a seguir. Para los principiantes: agregue la línea 'jquery: true' en su archivo .jshintrc.
genkilabs

3
¿Cuál es la razón de ": falso"? Encontré / * global $ * / funciona bien. (En mi caso fue / * global jQuery * / aunque)
Michiel

¿hay alguna manera de configurar esto genéricamente para todas las funciones dentro de un script, en lugar de escribir una por una /* global ... */? Normalmente importo un script con todas mis funciones en mi, mainpor lo que es engorroso definir uno por uno ...
tsando

148

También puede agregar dos líneas a su .jshintrc

  "globals": {
    "$": false,
    "jQuery": false
  }

Esto le dice a jshint que hay dos variables globales.


3
Esta debería ser la respuesta aceptada. contaminar CADA ARCHIVO javascript en su proyecto con varias líneas de código para que un comprobador de sintaxis sea feliz no es una opción. Gracias wmil
Cosmin

51

Todo lo que necesitas hacer es configurarlo "jquery": trueen tu .jshintrc.

Según la referencia de opciones de JSHint :

jquery

Esta opción define los globales expuestos por la biblioteca jQuery JavaScript.


66
Probablemente esta debería ser la respuesta principal ... lástima que esté enterrado aquí abajo
Zach Lysobey

¿Dónde encontrar el archivo .jshintrc en Sublime text 3? Traté de poner esta opción en el archivo SublimeLinter.sublime-settings (Preferencias-> Configuración del paquete-> SublimeLinter-> Settings-Default) y también intenté crear un nuevo archivo .jshintrc (my.jshintrc) en el directorio raíz de mi proyecto, de acuerdo con jshint.com/docs . Nada de esto me ayudó.
Milos

@Milos Instale JSHint Gutter en sublimetext 3. Vaya a Herramientas> JSHint> Establecer preferencias de linting, se abrirá .jshintrc.
niren

1
Nada más, todavía no puede reconocer el signo "$". Cuando abro .jshintrc está en la ruta: \ AppData \ Roaming \ Sublime Text 3 \ Packages \ JSHint Gutter, pongo "jquery": verdadero y no pasa nada.
Milos

¡Respuesta mucho mejor que agregar variables a la sección global! ¡Resuélvelo de esta manera!
Matthias Kleine

16

Aquí hay una pequeña lista feliz para poner en su .jshintrc
que agregaré a esta lista cuando pase el tiempo.

{
  // other settings...
  // ENVIRONMENTS
  // "browser": true, // Is in most configs by default
  "node": true,
  // others (e.g. yui, mootools, rhino, worker, etc.)
  "globals": {
    "$":false,
    "jquery":false,
    "angular":false
    // other explicit global names to exclude
  },
}

1
Si configura las opciones de "navegador" y "nodo" en "verdadero", los únicos elementos restantes en esta lista que son necesarios son $, jquery y angular. Para obtener más información, consulte la sección Medio ambiente de los documentos: jshint.com/docs/options/#environments
user456584

He editado la respuesta para incluir su actualización gracias @ user456584
James Harrington

8

Si está utilizando un editor IntelliJ como WebStorm, PyCharm, RubyMine o IntelliJ IDEA:

En la sección Entornos de Archivo / Configuración / JavaScript / Herramientas de calidad de código / JSHint, haga clic en la casilla de verificación jQuery.


1
También preste atención a que puede anular todas las configuraciones internas marcando "usar archivo de configuración". Esto hará que WS vea las modificaciones del archivo de configuración. Sin él, simplemente lo ignora.
neoswf

3

En lugar de recomendar el habitual "apagar los globales JSHint", recomiendo usar el patrón de módulo para solucionar este problema. Mantiene su código "contenido" y aumenta el rendimiento (basado en las "10 cosas que aprendí sobre Jquery" de Paul Irish ) ).

Tiendo a escribir los patrones de mi módulo de esta manera:

(function (window) {
    // Handle dependencies
    var angular = window.angular,
        $ = window.$,
        document = window.document;

    // Your application's code
}(window))

Puede obtener estos otros beneficios de rendimiento (explicados más aquí ):

  • Cuando se minimiza el código, la windowdeclaración de objeto pasada también se minimiza. por ejemplo, window.alert()convertirsem.alert() .
  • El código dentro de la función anónima autoejecutable solo usa 1 instancia del window objeto.
  • Se corta al grano cuando se llama a una windowpropiedad o método, evitando el costoso recorrido de la cadena de alcance, por ejemplo window.alert()(más rápido) versusalert() (más lento) rendimiento.
  • Alcance local de funciones a través del "espacio de nombres" y la contención (los globales son malvados). Si necesita dividir este código en scripts separados, puede crear un submódulo para cada uno de esos scripts e importarlos en un módulo principal.

2
Este es un patrón que también uso, pero no resuelve el problema original para mí. JSHint todavía se queja de que una variable no está definida en la última línea ( "}(window))"en su ejemplo, tuve problemas también con jQuery y Highcharts). No he encontrado una manera de desactivarla que no sea definir un global para el archivo, que luego vence el propósito.
myrosia

@myrosia browser: truele dice a JSHint que espera un entorno de navegador (donde windowya está definido).
Sam

Me gusta este enfoque!
jethroo

2

Si está utilizando un editor IntelliJ, en

  • Preferencias / Configuraciones
    • Javascript
      • Herramientas de calidad de código
        • JSHint
          • Predefinido (en la parte inferior), haga clic en Establecer

Puede escribir cualquier cosa, por ejemplo console:false, y también lo agregará a la lista (.jshintrc), como global.



Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.