2009-04-30 6 views
70

Estoy usando JSLint para verificar la mayoría de mis archivos Javascript externos, pero la mayor cantidad de errores que recibo proviene de las funciones que se usan antes de que se definan.JSLint: Usar una función antes de que se haya definido el error

¿Es esto realmente un problema que debería preocuparme por?

Parece que a Firefox, IE7 y Chrome no les importa. Las funciones como la popular init() (que uso a menudo) normalmente se adhieren en la parte superior, ya que eso tiene sentido para mí (me gusta simular que es análogo a main()), según JSLint, deberán colocarse en la parte inferior del archivo.

Respuesta

68

Si declara funciones utilizando la palabra clave function, puede usarlas antes de que se declaren. Sin embargo, si declara una función a través de otro método (como el uso de una expresión de función o el constructor Function), debe declarar la función antes de usarla. Consulte this page en Mozilla Developer Network para obtener más información.

Suponiendo que declare todas sus funciones con la palabra clave function, creo que se convierte en una pregunta de estilo de programación. Personalmente, prefiero estructurar mis funciones de una manera que parece lógica y hace que el código sea lo más legible posible. Por ejemplo, como tú, pondría una función init en la parte superior, porque es de donde todo comienza.

+1

prefiero método init lo alto también. Así que las funciones que usa van a continuación. ¿Cómo ignorar o piratear este error ya que me impide ver los próximos errores JsLint en el código? Quiero un enfoque general para mantener mi estilo, pero vea este error no. – Zon

84

Como este es el hit mejor valorado en Google y otras personas podrían no verlo al principio en la herramienta jslint, hay una opción llamada "Tolerar definiciones mal ordenadas" que le permite ocultar este tipo de error.

/*jslint latedef:false*/ 
+5

Establecer esa opción en 'true' no parece" resolver "este problema para mí. –

+0

Estoy experimentando el mismo problema que Markus. –

+0

¿Podría compartir su javascript? @ M.Herold – kontur

11

Desde la página web de JSLint (http://www.jslint.com/lint.html), se puede leer acerca de un/* mundial */directiva que le permite establecer las variables que se asumen para ser declarado en otro lugar.

Aquí es un ejemplo (poner esto en la parte superior del archivo):

/*global var1,var2,var3,var4,var5*/ 

El: true: true no es realmente necesario desde mi experiencia, pero parece que se recomienda a partir de lo que he leído en el sitio.

Asegúrate de que la declaración global inicial esté en la misma línea que /*, o de lo contrario se rompe.

+3

También para mí, la palabra global tiene que estar directamente después del asterisco, sin espacios o de lo contrario será ignorado. –

0

Puede declarar siempre la función problemática en la parte superior

por ejemplo: init var;

.... pero entonces usted tiene que quitar el "var" cuando se llega a la verdadera definición más abajo:

init = function() {} ;

+2

Advertencia: 'init = function() {}' no es lo mismo que 'function init() {}' ECMAScript tiene reglas diferentes para funciones anónimas, eso es lo primero. –

31

Si está usando jshint puede configurar latedef en nofunc, lo que ignorará las definiciones de funciones tardías solamente.

Documentación - http://www.jshint.com/docs/options/#latedef

Ejemplo de uso:

/* jshint latedef:nofunc */ 

noop(); 

function noop() {} 

Espero que esto ayude.

+0

Esta es la solución de 2014. –

+2

+1. Configuración de "latedef": "nofunc" en .jshintrc funcionó para mí. –

+2

¿Es esta solución solo para jshint? Uso "Corchetes" y recibo muchas advertencias sobre la pelusa. ¿Debería ser pelusa compatible con esta solución de pista? No lo hice funcionar. –

2

Para desactivar esta advertencia en jshint para todos los archivos, colocar esto en su archivo .jshintrc:

{ 
    "latedef": false 
} 
1

Es muy lamentable la opción latedef fue retirado. Esto es esencial cuando se trata de crear una 'clase' con una interfaz en la parte superior, es decir,

function SomeClass() { 
    var self = this; 
    self.func = func; 

    function func { 
     ... 
    } 
} 

Este estilo es muy común, pero no pasa JSLint porque func se 'usa' antes de ser definido. Tener que usar global para cada función de 'miembro' es un dolor total.

2

En el archivo .jshintrc, establezca:

"latedef": "nofunc", 
Cuestiones relacionadas