Pregunta

Tengo una larga archivo JavaScript que pasa JSLint, excepto para "que se utiliza antes de que se definen" los errores.

He utilizado la función normal de las declaraciones, como en...

function whatever() {do something;}

como contraposición a la...

var whatever = function(){do something;};

y en consonancia con Steve Harrison respuesta a un post anterior...

Suponiendo que declarar todos sus funciones con la palabra clave function, me creo que se convierte en una programación de estilo pregunta.Personalmente, yo prefiero la estructura de mis funciones en una forma que parece lógico y hace que el código como legible como sea posible.Por ejemplo, como usted, yo pondría una función init en la parte superior, porque es donde todo comienza a partir.

...Me gusta ver a las funciones en un orden que tenga sentido para mí.

El script funciona perfectamente en los navegadores probados (por ejemplo, FireFox, Safari, Mobile Safari, Fennec, IE, Chrome, Midori, etc.).

Aquí está el problema:Quiero usar la secuencia de comandos dentro de una aplicación de iPhone que se construye con Titanium pero su compilador se detiene con "utilizado antes de que define" los errores.

¿Cómo puedo evitar esto?

Esta podría ser una pregunta estúpida, pero también...Si las funciones deben llamarse en un orden en particular, ¿cómo hace uno para resolver el asunto de una llamada de función de la necesidad de volver a llamar a la función que originalmente llamada?Por ejemplo...

function buildMenu(){
     Display a list of five menu items, each of which calls a function to build the associated screen.
}

function screen1() {
     Display the screen associated with menu item #1.
}

Si las funciones que deben declararse en orden, function screen1 debería preceder function buildMenu.Pero lo que si, bajo ciertas condiciones, screen1 no puede ser construido y, por tanto, quiere volver a mostrar el menú (es decir, llamar a una función que es técnicamente aún no declarado)?

Oh, sí...una pregunta más:Hay sitios web o programas que automáticamente re-secuencia de las funciones en lugar de requerir que el programador para hacerlo de forma manual?

¿Fue útil?

Solución

No, la respuesta de EM no es la solución correcta. Intente ejecutar este JavaScript:

(function () {
   foo(); // right

   var foo = function () {
     console.log("wrong");
   };

   foo(); // wrong

   function foo() {
     console.log("right");
   }

   foo(); // wrong
}());

Esto se debe a que el intérprete leerá primero la declaración de función, creará el nombre foo en función que imprime "correcto", luego lee el var declaración, y descubra que ya hay un nombre foo Entonces se omitirá crear una nueva variable con el valor undefined, como sucede normalmente. Luego procesa el código, línea por línea, que incluye una asignación a foo. La declaración de función no se reprocesa. Tal vez esto se comportará de manera diferente en Titanium, pero intente esto en Firebug y obtendrá lo que obtuve.

Una mejor solución es:

var screen1, buildMenu;

screen1 = function () { buildMenu(); };
buildMenu = function () { screen1(); };

Esto también pasará jslint y producirá el comportamiento correcto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top