2011-01-19 22 views
10

Stavo esplorando lo Google Closure Compiler e una cosa che ho notato è che convertein for(;;).Empty for loop - for (;;)

Entrambi bloccano il browser, ma perché il ciclo vuoto for non si interrompe immediatamente da solo? La seconda parte è vuota, e quindi falsa. Non è vero che quando la seconda parte è falsa, il ciclo for si interrompe e l'esecuzione continua con il codice che segue il ciclo for?

Qualcuno potrebbe forse dare una spiegazione per questo?

+2

Forse è più veloce ... qualcuno dovrebbe benchmark loro :) –

+2

bene, è più piccola - questo è ciò che il compilatore fa: basta minifying il codice (si tratta di un ottimo strumento davvero) – pimvdb

risposta

20

No, non è vero.

Vedi: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for

condizione

Un'espressione da valutare prima di ogni iterazione del ciclo. Se l'espressione è true, viene eseguita l'istruzione . Questo test condizionale è facoltativo. Se si omette , la condizione sempre restituisce true. Se l'espressione restituisce false, l'esecuzione salta a la prima espressione che segue il costrutto .

Dovrei forse dare un collegamento al riferimento ECMAScript, ma sono abbastanza sicuro che afferma più o meno la stessa cosa.

+4

Buona fortuna. Ho appena esaminato le [specifiche ECMA-262] (http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf) per i cicli 'for' e sono generalmente imperscrutabili. Il comportamento di cui sopra è una conseguenza del seguire i passaggi nella specifica, piuttosto che essere esplicitamente richiesto da esso. – Phrogz

+0

Oh bene ... Quindi suppongo che il riferimento di Mozilla e la mia parola che tutte le varianti popolari di ECMAScript si comportino in questo modo devono essere sufficienti. : D – Mchl

1

Una parte centrale vuota deve essere interpretata come true, quindi non è falsa. Ha la stessa semantica in C e altre lingue con quel tipo di loop (come C#, Java e così via). Sarebbe una vera trappola averlo cambiato per JavaScript.

+1

Non lo sapevo. Inoltre non voglio che sia cambiato, mi stavo solo chiedendo. – pimvdb

+0

@pimvdb: L'ho capito anche io :) Volevo solo sottolineare che non era proprio il creatore di JavaScript. Ha solo dovuto fare quello che tutti gli altri stavano facendo (o confondere un sacco di persone). A pensarci bene, credo che abbia confuso la gente, ma con altre parti della lingua: D – Jakob

4

Dal ECMAScript language specification:

IterationStatement: for (ExpressionNoIn_opt; Expression_opt; Expression_opt) Dichiarazione

se la prima espressione è presente, allora

  1. Sia testExprRef essere il risultato della valutazione della prima Espressione.
  2. Se GetValue (testExprRef) è falso, restituisce (normale, V, vuoto).

Poiché la prima espressione (il secondo argomento di for) non è presente, questa sezione non viene mai eseguita, quindi il ciclo for non esce.

1

C'è la valutazione algorothm del ciclo for in standard ECMA-262 script che dice che ci sono solo due situazioni in cui ciclo si concluderà:

  1. istruzione break
  2. valore della dichiarazione centrale pari a falso , ma solo se questa dichiarazione è presente, quindi non deve essere necessario valutare come true (probabilmente nel motore mozilla js è).