¿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

  • cómo rectificar "Inseguro". '. error "en Jslint
  • jslint: ¿por qué este código da como resultado un post de error de "Estricta violación"?
  • ¿Cómo es que JQuery no pasa JSLint?
  • JSLint informa el carácter "Pendiente inesperado" en un nombre de variable con prefijo subrayado
  • ¿Puedo formatear mi código JavaScript / JQuery con saltos de línea y tabs?
  • Solución para errores JSLint
  • JSLint, else y Se esperaba exactamente un espacio entre el error '}' y 'else'
  • ¿Por qué JSlint devuelve un error "Inesperado". "."
  • Error de tabuladores y espacios mixtos de JSLint
  • JSLint esperaba '===' y en su lugar vio '=='
  • JSLint "inseguro ^" en expresión regular
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.