Nie mogłem zbyt dobrze zrozumieć tych 3 zasad w specyfikacjach - mam nadzieję, że będę mieć coś, co będzie bardziej zrozumiałe po angielsku - ale oto, co zebrałem z JavaScript: The Definitive Guide, 6. wydanie, David Flanagan, O'Reilly, 2011:
Zacytować:
JavaScript nie traktuje każdego podziału linii jako średnika: zwykle traktuje podziały linii jako średniki tylko wtedy, gdy nie może parsować kodu bez średników.
Kolejny cytat: na kod
var a
a
=
3 console.log(a)
JavaScript nie traktuje podziału drugiego wiersza jako średnika, ponieważ może dalej analizować dłuższą instrukcję a = 3;
i:
dwa wyjątki od ogólnej zasady, że JavaScript interpretuje podziały wierszy jako średniki, gdy nie może parsować drugiego wiersza jako kontynuacji instrukcji w pierwszym wierszu. Pierwszy wyjątek dotyczy instrukcji return, break i kontynuuj
... Jeśli po którymkolwiek z tych słów pojawi się podział wiersza ... JavaScript zawsze interpretuje ten podział jako średnik.
... Drugi wyjątek dotyczy operatorów ++ i −− ... Jeśli chcesz użyć jednego z tych operatorów jako operatorów Postfiksa, muszą one pojawiać się w tym samym wierszu, co wyrażenie, którego dotyczą. W przeciwnym razie podział wiersza będzie traktowany jako średnik, a ++ lub - zostanie przeanalizowany jako operator prefiksu zastosowany do następującego kodu. Rozważ ten kod, na przykład:
x
++
y
Jest analizowany jako x; ++y;
, a nie jakox++; y
Myślę więc, aby to uprościć, co oznacza:
W ogóle, JavaScript będzie traktować go jako kontynuacji kodu tak długo, jak to ma sens - z wyjątkiem 2 przypadkach: (1) po niektóre słowa kluczowe podoba return
, break
, continue
oraz (2) jeżeli uzna to ++
albo --
na nowej linii, a następnie doda ;
na koniec poprzedniej linii.
Część o „traktuj to jako kontynuację kodu tak długo, jak ma to sens”, sprawia wrażenie chciwego dopasowania wyrażenia regularnego.
W związku z powyższym oznacza to, że return
przy podziale wiersza interpreter JavaScript wstawi znak;
(cytowany ponownie: jeśli po którymkolwiek z tych słów pojawi się podział wiersza [np. return
] ... JavaScript zawsze interpretuje ten podział wiersza jako średnik)
i z tego powodu klasyczny przykład
return
{
foo: 1
}
nie będzie działać zgodnie z oczekiwaniami, ponieważ interpreter JavaScript potraktuje to jako:
return; // returning nothing
{
foo: 1
}
Nie może następować łamanie linii natychmiast po return
:
return {
foo: 1
}
aby działał poprawnie. I możesz wstawić ;
siebie, jeśli będziesz przestrzegać zasady używania ;
instrukcji po:
return {
foo: 1
};