2012-06-20 9 views
8

Sono in fase di debug di JavaScript di un altro sviluppatore per un progetto al lavoro.Javascript per ciclo mancante parte centrale: errore o avanzato?

io sono probabilmente un medio livello di sviluppo JavaScript in una buona giornata e ho incontrato un ciclo for che appare spezzato:

for(i = 0; ; i++) 

Qualcuno può dirmi se questo è davvero un errore o se in alcuni casi questo è un modo perfettamente valido per fare cose avanzate?

+0

Per avanzato intendo incapsulamento, ricorsione, chiusure, ecc. Cose che non capisco completamente. Grazie. – timmackay

+0

Questa è una buona domanda. – Pointy

risposta

4

È OK e perfettamente legale. Uno dei tre slot in una dichiarazione for può essere lasciato vuoto. Fatta eccezione per la condizione che ho aggiunto, è logicamente lo stesso di questo:

i = 0; 
while (true) { 
    // other code here 
    if (some condition) { 
     break; 
    } 
    i++; 
} 

Sarà un ciclo infinito a meno che non ci sia una prova in qualche parte del ciclo che emette una dichiarazione break in alcune condizioni per interrompere il loop (Ho aggiunto un test di esempio al mio esempio di codice).

+0

Questo ha senso, se ancora un po 'di confusione. Grazie per aver risposto. – timmackay

+0

Inoltre, (probabilmente sto facendo il pignolo, ma dato che hai fatto una modifica al tuo post che indica che l'unica differenza è l'istruzione if che hai aggiunto andrò avanti e) farò notare che il codice originale non lo fa Usiamo la parola chiave 'var' così nell'originale' i' può essere globale e qui è locale a qualsiasi scope del loop. Molto probabilmente è inteso comunque, ma se l'OP ha 'var i;' da qualche parte prima nella funzione in cui si trova sarebbe una dichiarazione ridondante della variabile per ripeterla. – Paulpro

+0

@ ascii-lime - OK, ho tirato fuori il 'var'. – jfriend00

1

È perfettamente OK fino a quando all'interno del ciclo c'è una dichiarazione break.

Se non c'è un'istruzione di interruzione, il runtime di JavaScript continuerà a eseguire il codice nel ciclo, più e più volte, con "i" in crescita, in crescita e in crescita. Presto, "io" diventerà un numero più grande di qualsiasi cosa; più grande del numero di Lego che il bambino ricco che conoscevi a scuola aveva perfino nella sua stanza dei giochi. Andrà oltre quello per essere un numero più grande del numero di formiche nel mondo, quindi il numero di Starbucks, quindi il numero di molecole d'acqua nell'oceano. Ad un certo punto il browser potrebbe chiedere se vuoi che si fermi la sceneggiatura, ma se sei curioso, se sei il tipo di persona a cui piace esplorare l'ignoto, allora declinerai l'offerta e lascerai andare. Presto il valore di "io" raggiungerà valori veramente astronomici e le cose diventeranno interessanti. Ricorda come in 2001 A Space Odyssey le cose si sono fatte strane quando il tizio è stato risucchiato in Giove o cos'altro? Beh, potrebbe essere così.

Prova un jsfiddle.

3

Ciò è valido. Ciascuna delle tre espressioni nel ciclo for for(expr1; expr2; expr3) può essere vuota. Ad esempio for(; ;) è la stessa cosa di while(true).

expr1 è un'espressione che viene eseguita una volta appena prima dell'inizio del ciclo. Puoi anche avere qui una dichiarazione di dichiarazione variabile invece di un'espressione che è ciò che hai nel tuo codice.
expr2 è un'espressione che viene eseguita immediatamente prima di ogni iterazione del ciclo e se il valore dell'espressione è falsy, il ciclo viene eseguito. Se l'espressione è omessa, è considerata sincera.
expr3 è un'espressione che viene eseguita subito dopo ogni iterazione del ciclo.

La dichiarazione che hai è essenzialmente un while(true) loop (che dovrebbe contenere una dichiarazione break da qualche parte all'interno di esso, che conta il numero di volte che itera usando la variabile i.

+0

Grazie per la spiegazione. Al mio livello continuerò ad attenermi ai cicli di base ma è bello sapere che sono più flessibili di quanto pensassi inizialmente. – timmackay

1

Si tratta di un valido approccio per fare un infinito loop con un contatore incrementale.Se questo è intenzionale o no è tutta un'altra questione, motivo per cui io personalmente sono contrario all'utilizzo di loop in casi bizzarri del genere.Potrebbe ovviamente risolvere qualsiasi problema con tale utilizzo anche se

0

Un ciclo ha una sintassi semplice:

  1. di dichiarazione delle variabili => i = 0
  2. loop di controllo enterance =>
  3. Creazione di un altro loop => i ++

Poiché JavaScript restituisce true per niente (correggimi se ho torto), quindi il controllo di enterance del loop è sempre vero.

Questa non è affatto una buona pratica. Quindi credo fermamente che questo sia un codice non funzionante. Non ho mai visto un esempio di loop infinito di design.

Problemi correlati