Po pierwsze, chciałbym zwrócić uwagę, że taka pętla jest uważana za zły styl, ponieważ jest bardzo nieczytelna i powoduje wiele zamieszania. Jest to typowy przykład niepowodzenia optymalizacji.
Patrząc na specs, po for(...)
musi następować instrukcja . Może to być any statement, w tym bloki. Więc to wszystko jest ważne:
for (...)
foo; // expression statement
,
for(...)
{
// block statement
}
,
for(...)
if(...) // If statement
foo;
i oczywiście
for (...)
;
ponieważ ";
" jest empty statement. Nie robi nic, ale wystarcza, aby uczynić for(...);
syntaktycznie poprawną.
Teraz, dla przecinków. Zauważ, że zawartość parens musi być trzy expressions (każda z nich opcjonalna), oddzielone średnikami. Niemal "wszystko" kwalifikuje się jako wyrażenia, w tym comma-separated lists of expressions. Choć mało znane, działają one praktycznie wszędzie w JS, nie tylko w pętlach for
. Są one po prostu oceniane jeden po drugim.
Tak, pętla może być zapisane jak tak
shuffle = function(o) {
var j, x, i = o.length;
while (i) { // for-loops are just while-loops in disguise
j = parseInt(Math.random() * i), // even better: replace , by ;
x = o[--i],
o[i] = o[j],
o[j] = x;
}
return o;
};
Również x = o[--i]
powinien być zapisany jako i--; x = o[i]
.
Jeśli istnieje tylko jedna pętla, skrypt będzie działał, ale jeśli masz więcej niż jeden zaraz po drugim, musisz oddzielić instrukcje. – Rayshawn