2010-03-05 7 views
10

Ho un lungo file JavaScript che supera JSLint ad eccezione degli errori "usato prima che fosse definito".Contendente con JS "usato prima definito" e Titanium Developer

ho usato dichiarazioni di funzione normale, come in ...

function whatever() {do something;} 

al contrario di ...

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

e coerente con Steve Harrison's reply ad un precedente post ...

Presumendo che dichiariate tutte le vostre funzioni con la parola chiave function, I pensateci diventa una domanda di programmazione . Personalmente, preferisco strutturare le mie funzioni in modo che sembra logico e rende il codice come leggibile il più possibile. Ad esempio, come te, metterei una funzione di inizializzazione a in alto, perché è da lì che inizia tutto il .

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

Lo script funziona perfettamente nei diversi browser testati (ad esempio, FireFox, Safari, Safari mobile, Fennec, IE, Chrome, Midori, ecc.).

Ecco il problema: voglio utilizzare lo script all'interno di un'app per iPhone in fase di creazione con Titanium ma il suo compilatore si arresta con errori "used before defined".

Come posso aggirare questo?

Questa potrebbe essere una domanda stupida, ma anche ... Se le funzioni devono essere chiamato in un ordine particolare, come si fa a risolvere la questione di una funzione chiamata bisogno di richiamare alla funzione che originariamente ha chiamato? 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 avrebbe bisogno precedere function buildMenu. Ma cosa succede se, in determinate condizioni, screen1 non può essere compilato e quindi vuole rivisualizzare il menu (cioè, chiamando una funzione tecnicamente non ancora dichiarata)?

Oh sì ... un'altra domanda: ci sono siti Web o programmi che eseguono automaticamente la sequenza delle funzioni anziché richiedere al programmatore di eseguirlo manualmente?

risposta

8

No, la risposta di EM NON è la soluzione giusta. Provare 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 prima di leggere la dichiarazione di funzione, creare il nome foo come una funzione che stampa "giusto", quindi recita la dichiarazione var, e scoprire che c'è già un nome foo quindi salterà la creazione di una nuova variabile con il valore undefined, come normalmente accade. Quindi elabora il codice, riga per riga, che include un'assegnazione a foo. La dichiarazione della funzione non viene rielaborata. Forse questo si comporta diversamente in Titanium, ma prova questo in Firebug e otterrai ciò che ho ottenuto.

Una soluzione migliore è:

var screen1, buildMenu; 

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

Ciò inoltre passare JSLint, e produrre il comportamento corretto.

+0

Grazie. Non ho avuto il tempo di controllare la soluzione precedente, quindi darò una possibilità. Grazie ancora. –

+0

Buon punto. Non ho effettivamente testato la mia soluzione. L'ho appena eseguito tramite jslint. – EndangeredMassa

+0

ha funzionato perfettamente sia in JSLint che in titanio. Grazie ancora. B. BTW: per chiunque abbia bisogno di apportare questa modifica a uno script esistente, come ho fatto io, un collegamento facile per creare l'elenco di variabili globali delle funzioni è eseguire lo script tramite JSLint e copiare l'elenco Globale dal basso di i risultati. Non è preciso al 100% ma nella mia situazione, con circa 100 funzioni, avevo solo bisogno di fare una mezza dozzina di regolazioni. –