¿Por qué JSLint se queja de una variable global indefinida / implícita?

Estoy tratando de entender por qué JSLint se queja de una variable global implícita en el siguiente ejemplo:

var TEST = (function () { var count = 0; function get_count() { return add_one(); } function add_one() { count += 1; return count; } return { get_count: get_count }; }()); 

Ejecutando esto a través de JSLint da el error:

Problema en la línea 5 carácter 12: 'add_one' no está definido.

Además de decir:

Global implícito: add_one 5

Si mueve la function add_one() antes de la function get_count() , el error desaparece. Sin embargo, con el código como está arriba, no produce ningún error cuando lo ejecuta en el browser. ¿Alguien puede explicar por qué JSLint se queja?

¡Gracias!
Mate

3 Solutions collect form web for “¿Por qué JSLint se queja de una variable global indefinida / implícita?”

Esto se debe a que JSLint usa un analizador Pratt , un analizador de arriba hacia abajo, no un intérprete completo de JavaScript. Si realmente fue interpretado, entonces no le daría ese error.

add_one es un global implícito porque el analizador aún no se encontró con esa variable, por lo que supone que el código que lo rodea tendrá esa variable. Pero, si lo das vuelta, entonces el analizador ya ha encontrado la variable add_one y es todo melocotones y crema 🙂

Por cierto, noté un pequeño error tipográfico en la línea de function de cierre: }()); debería ser })(); .

Cambio el order en el que se declararon los methods que resolverá su problema. Como se menciona en otra respuesta, algunos análisis de JavaScript utilizan un enfoque de arriba hacia abajo para leer el código, de forma similar a como lo hace el lenguaje de progtwigción C. Los intérpretes y comstackdores modernos usan un enfoque de 2 pasos. El primer paso es leer / comstackr los methods en la memory. Si se encuentra con alguna llamada a método que no conoce, searchá en todo el set de methods en la memory para determinar si existe. Recomiendo arreglar el pedido porque, aunque no cause problemas, cargará el método en la memory antes con el cambio.

 var TEST = (function () { var count = 0; function add_one() { count += 1; return count; } function get_count() { return add_one(); } return { get_count: get_count }; }()); 

Obtiene * add_one no definido * porque JSLint cree que las expresiones de function deben declararse en el order correcto y para el otro problema ("* Implied global: add_one 5 *"), es suficiente que ponga un comentario como / * globals add_one * / en la parte superior de su script

  • "Tolerar la estupidez" de JSLint
  • Acerca de JSLint, su desagrado por los loops for y la optimization de la queue de llamada
  • ¿Cómo puedo usar JSLint para un segmento de código que depende de JQuery?
  • jsHint problema de "function no definida", ¿el order de las declaraciones de funciones es importante?
  • cómo rectificar "Inseguro". '. error "en Jslint
  • jslint marcar "comentario peligroso"
  • JSLint "inseguro ^" en expresión regular
  • ¿Hay alguna herramienta que ejecute JSLint, el validador W3C (tanto CSS3 como HTML5) en los files de un directory determinado?
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.