Najpierw powinienem chyba zapytać, czy to zależy od przeglądarki.
Czytałem, że jeśli zostanie znaleziony niepoprawny token, ale sekcja kodu jest ważna do tego niepoprawnego tokena, średnik jest wstawiany przed tokenem, jeśli poprzedza go podział linii.
Jednak częstym przykładem cytowanych błędów spowodowanych wstawieniem średnika jest:
return
_a+b;
.. który nie wydaje się przestrzegać tej zasady, ponieważ _a byłby prawidłowym tokenem.
Z drugiej strony zrywanie łańcuchów połączeń działa zgodnie z oczekiwaniami:
$('#myButton')
.click(function(){alert("Hello!")});
Czy ktoś ma bardziej szczegółowy opis zasad?
Odpowiedzi:
Przede wszystkim powinieneś wiedzieć, na które instrukcje ma wpływ automatyczne wstawianie średników (zwane również ASI dla zwięzłości):
var
komunikatdo-while
komunikatcontinue
komunikatbreak
komunikatreturn
komunikatthrow
komunikatKonkretne reguły ASI są opisane w specyfikacji § 11.9.1 Zasady automatycznego wstawiania średnika
Opisano trzy przypadki:
Kiedy napotkasz token (
LineTerminator
lub}
), który jest niedozwolony przez gramatykę, wstawia się przed nim średnik, jeśli:LineTerminator
.}
np . :
przekształca się w
NumericLiteral
1
Spełnia pierwszy warunek, następujący znacznik jest terminator linii. Spełnia drugiego warunku, następujący token .2
}
Gdy napotkany zostanie koniec strumienia wejściowego tokenów, a analizator składni nie będzie w stanie przeanalizować strumienia tokenu wejściowego jako pojedynczego kompletnego Programu, wówczas średnik zostanie automatycznie wstawiony na końcu strumienia wejściowego.
np . :
przekształca się w:
Ten przypadek występuje, gdy token jest dozwolony przez pewną produkcję gramatyki, ale produkcja jest produkcją ograniczoną , średnik jest wstawiany automatycznie przed tokenem ograniczonym.
Ograniczone produkcje:
Klasyczny przykład z
ReturnStatement
:przekształca się w
źródło
++c
dla jasności?Prosto z ECMA-262, piąta edycja ECMAScript Specyfikacja :
źródło
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ć:
Kolejny cytat: na kod
i:
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
nie będzie działać zgodnie z oczekiwaniami, ponieważ interpreter JavaScript potraktuje to jako:
Nie może następować łamanie linii natychmiast po
return
:aby działał poprawnie. I możesz wstawić
;
siebie, jeśli będziesz przestrzegać zasady używania;
instrukcji po:źródło
Jeśli chodzi o wstawianie średników i instrukcję var, uważaj, aby nie zapomnieć o przecinku, jeśli używasz zmiennej var, ale obejmuje ona wiele wierszy. Wczoraj ktoś znalazł to w moim kodzie:
Działało, ale efekt był taki, że deklaracja / przypisanie srcIds było globalne, ponieważ lokalna deklaracja z var w poprzednim wierszu nie była już stosowana, ponieważ ta instrukcja została uznana za zakończoną z powodu automatycznego wstawiania średnika.
źródło
var srcRecords = src.records srcIds = [];
w jednym wierszu zapominasz przecinek lub piszesz „return a&&b” i nie zapominasz nic ... ale podział linii przed a wstawiałby automatyczny średnik po powrocie, który jest zdefiniowany przez zasady ASI ...var
(let
,const
) w każdym wierszu przewyższa ułamek sekundy potrzebny na wpisanie.Najbardziej kontekstowy opis automatycznego wstawiania średników JavaScript, jaki znalazłem, pochodzi z książki o tłumaczach rzemieślniczych .
Następnie opisuje to tak, jakbyś kodował zapach .
źródło
Po prostu dodaj
zobacz to, używając natychmiast wywołanego wyrażenia funkcyjnego (IIFE)
źródło