Domanda

Ho un lungo file JavaScript che passa JSLINT ad eccezione degli errori "usati prima che fosse definito".

Ho usato le normali dichiarazioni delle funzioni, come in ...

function whatever() {do something;}

al contrario di ...

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

e coerente con La risposta di Steve Harrison a un post precedente ...

Supponendo che dichiari tutte le tue funzioni con la parola chiave della funzione, penso che diventi una domanda in stile programmazione. Personalmente, preferisco strutturare le mie funzioni in un modo che sembra logico e rende il codice il più leggibile possibile. Ad esempio, come te, avrei messo una funzione Init in alto, perché è da dove inizia tutto.

... Mi piace vedere le funzioni in un ordine che ha senso per me.

La sceneggiatura funziona perfettamente nei vari browser testati (ad es. Firefox, Safari, Safari mobile, Fennec, IE, Chrome, Midori, ecc.).

Ecco il problema: voglio utilizzare lo script all'interno di un'app per iPhone in costruzione con titanio ma il suo compilatore si ferma con errori "usati prima definiti".

Come posso aggirare questo?

Questa potrebbe essere una domanda stupida ma anche ... se le funzioni devono essere chiamate in un ordine particolare, come si risolve la questione di una funzione chiamata che ha bisogno di richiamare alla funzione che originariamente la chiamava? Per esempio...

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.
}

Se le funzioni devono essere dichiarate in ordine, function screen1 Dovrebbe precedere function buildMenu. Ma cosa succede se, in determinate condizioni, Screen1 non può essere costruito e quindi vuole ridistribuire il menu (cioè, chiamando una funzione che non è ancora dichiarata ancora)?

Oh sì ... un'altra domanda: ci sono siti Web o programmi che riescono automaticamente le funzioni piuttosto che richiedere al programmatore di farlo manualmente?

È stato utile?

Soluzione

No, la risposta di EM non è la soluzione giusta. Prova a eseguire questo JavaScript:

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

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

   foo(); // wrong

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

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

Questo perché l'interprete leggerà per la prima volta la dichiarazione della funzione, creerà il nome foo come funzione che stampa "a destra", quindi legge il var dichiarazione e scopri che esiste già un nome foo Quindi salterà creando una nuova variabile con il valore undefined, come succede normalmente. Quindi elabora il codice, riga per riga, che include un incarico a foo. La dichiarazione della funzione non viene ritrattata. Forse questo si comporterà diversamente nel titanio, ma prova questo a Firebug e otterrai quello che ho ottenuto.

Una soluzione migliore è:

var screen1, buildMenu;

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

Ciò passerà anche JSLINT e produrrà il comportamento corretto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top