Na mojej konsoli pojawia się błąd JavaScript:
Uncaught SyntaxError: Nieoczekiwany token NIELEGALNY
To jest mój kod:
var foo = 'bar';
To bardzo proste, jak widać. Jak może to powodować błąd składniowy?
javascript
syntax-error
illegal-characters
bfavaretto
źródło
źródło
Odpowiedzi:
Błąd
Kiedy kod jest analizowany przez interpreter JavaScript, zostaje podzielony na części zwane „tokenami”. Gdy tokena nie można zaklasyfikować do jednego z czterech podstawowych typów tokena , w większości implementacji zostaje on oznaczony jako „NIELEGALNY”, a błąd zostaje zgłoszony.
Ten sam błąd pojawia się, gdy na przykład próbujesz uruchomić plik js z nieuczciwym
@
znakiem, źle umieszczony nawias klamrowy, nawias kwadratowy, „inteligentne cytaty”, pojedyncze cudzysłowy niepoprawnie ujęte (np.this.run('dev1)
) I tak dalej.Ale nie widzę nic nielegalnego!
W kodzie znajduje się niewidoczny znak, tuż po średniku. Jest to znak
U+200B
spacji o zerowej szerokości Unicode (inaczejZWSP
encja HTML​
). Znany jest ten znak, który powodujeUnexpected token ILLEGAL
błąd składniowy JavaScript.A skąd to się wzięło?
Nie wiem na pewno, ale mój zakład dotyczy jsfiddle . Jeśli stamtąd wkleisz kod, najprawdopodobniej będzie zawierać jeden lub więcej
U+200B
znaków. Wygląda na to, że narzędzie używa tego znaku do kontrolowania zawijania słów na długich ciągach.Doniesiono również, że kod wklejony z narzędzi programistycznych Chrome może zawierać ten znak, ale nie byłem w stanie go odtworzyć w bieżącej wersji (22.0.1229.79 na OSX).
Jak mogę to zauważyć?
Postać jest niewidoczna. Skąd wiemy, że tam jest? Możesz poprosić swojego redaktora o wyświetlanie niewidzialnych znaków. Większość edytorów tekstu ma tę funkcję. Na przykład Vim wyświetla je domyślnie, a
ZWSP
pokazuje jako<u200b>
. Możesz także debugować go w trybie online: jsbin wyświetla znak jako czerwoną kropkę na panelach kodu (ale wydaje się, że usuwa go po zapisaniu i ponownym załadowaniu strony). CodePen.io wyświetla go również jako kropkę i zachowuje go nawet po zapisaniu.Powiązane problemy
Ta postać nie jest czymś złym, może być naprawdę przydatna. Ten przykład na Wikipedii pokazuje, jak można go użyć do kontrolowania, gdzie długi łańcuch powinien być zawinięty do następnego wiersza. Jeśli jednak nie jesteś świadomy obecności postaci na znacznikach, może to stanowić problem. Jeśli masz go wewnątrz ciągu znaków (np.
nodeValue
Elementu DOM, który nie ma widocznej zawartości), możesz oczekiwać, że taki ciąg znaków będzie pusty, podczas gdy w rzeczywistości tak nie jest (nawet po zastosowaniuString.trim
).ZWSP
może również powodować wyświetlanie dodatkowych spacji na stronie HTML, na przykład gdy znajdzie się między dwoma<div>
elementami (jak widać na tym pytaniu ). Ten przypadek nie jest nawet odtwarzalny w jsfiddle, ponieważ znak jest tam ignorowany.Kolejny potencjalny problem: jeśli kodowanie strony internetowej nie zostanie rozpoznane jako UTF-8, znak może faktycznie zostać wyświetlony (
​
na przykład w Latin1).Jeśli
ZWSP
jest obecny w kodzie CSS (kod wbudowany lub zewnętrzny arkusz stylów), style również nie mogą zostać poprawnie przeanalizowane, więc niektóre style nie zostaną zastosowane (jak widać na tym pytaniu ).Specyfikacja ECMAScript
Nie mogłem znaleźć żadnej wzmianki o tym konkretnym znaku w specyfikacji ECMAScript (wersje 3 i 5.1 ). Obecna wersja wymienia podobne znaki (
U+200C
iU+200D
) w sekcji 7.1 , która mówi, że powinny być traktowane jakoIdentifierPart
s, gdy „poza komentarzami, literałami ciągów i literałami wyrażeń regularnych”. Znaki te mogą na przykład być częścią nazwy zmiennej (ivar x\u200c;
faktycznie działają).W sekcji 7.2 wymieniono prawidłowe znaki spacji (takie jak tabulator, spacja, spacja bez przerw itp.) I niejasno wspomina, że każdy inny „separator spacji” Unicode (kategoria „Z”) powinien być traktowany jako spacja. Prawdopodobnie nie jestem najlepszą osobą do omawiania specyfikacji w tym zakresie, ale wydaje mi się, że
U+200B
należy to uznać za białą przestrzeń zgodnie z tym, kiedy w rzeczywistości implementacje (przynajmniej Chrome i Firefox) wydają się traktować je jako nieoczekiwane token (lub część jednego), powodujący błąd składniowy.źródło
function
słowa kluczowego, które było niewidoczne w Vimie, dopóki go nie zaznaczyłem za pomocą metody FAQ „Podświetl wszystkie znaki niedrukowalne”. Ahh, byłoby miło, gdyby istniał sposób na kopiowanie tylko znaków w zakresie 32..127 (ale prawdopodobnie jest na to aplikacja :))dlaczego szukasz tego problemu w swoim kodzie? Nawet jeśli jest skopiowany.
Jeśli widzisz, co dokładnie dzieje się po zapisaniu pliku w zsynchronizowanym folderze - zobaczysz coś
*****
na końcu pliku. To wcale nie jest związane z twoim kodem.Rozwiązanie.
Jeśli używasz
nginx
w błędnym polu - dodaj do konfiguracji serwera:Jeśli używasz
apache
w błędnym polu - dodaj do konfiguracji serwera:Źródło problemu: Błąd VirtualBox
źródło
Może się tak również zdarzyć, jeśli kopiujesz kod z innego dokumentu (np. PDF) na konsolę i próbujesz go uruchomić.
Próbowałem uruchomić przykładowy kod z książki JavaScript, którą czytam, i byłem zaskoczony, że nie uruchomił się w konsoli.
Najwyraźniej kopiowanie z pliku PDF wprowadza do kodu pewne nieoczekiwane, nielegalne i niewidoczne znaki.
źródło
Miałem ten sam problem na moim komputerze Mac i stwierdziłem, że było tak, ponieważ Mac zastępował standardowe cytaty kręconymi cytatami, które są niedozwolonymi znakami javascript.
Aby to naprawić, musiałem zmienić ustawienia na moim komputerze Mac Preferencje systemowe => Klawiatura => Tekst (karta) odznacz Użyj inteligentnych cytatów i myślników (domyślnie zaznaczono).
źródło
Wystąpił ten błąd w chrome, gdy po wierszu wskazanym przez błąd miałem nieskończony ciąg znaków. Po zamknięciu ciągu błąd zniknął.
Przykład z błędem:
Przykład bez błędu:
źródło
Jeśli używasz włóczęgi instalacyjnej nginx + uwsgi, głównym problemem jest błąd wirtualnego pudełka z plikiem wysyłania, jak wspomniano w niektórych odpowiedziach. Jednak aby to rozwiązać, musisz wyłączyć sendfile zarówno w nginx, jak i uwsgi.
W nginx.conf wyślij plik
uwsgi application / config --disable-sendfile
źródło
Podczas uruchamiania systemu OS X system plików tworzy ukryte widelce w zasadzie wszystkich twoich plików, jeśli znajdują się one na dysku twardym, który nie obsługuje HFS +. Może to czasem (tak mi się teraz zdarzyło) doprowadzić do tego, że silnik JavaScript próbuje uruchomić widelec danych zamiast kodu, który zamierzasz uruchomić. Kiedy tak się stanie, otrzymasz również
ponieważ widelec danych twojego pliku będzie zawierał znak Unicode U + 200B. Usunięcie pliku rozwidlenia danych spowoduje, że skrypt uruchomi rzeczywisty, zamierzony kod, zamiast rozwidlenia danych binarnych w kodzie.
źródło
Oto mój powód:
przed:
co
\u
jest ucieczką, doszedłem do tego, używając analizy JS Codepena .po:
i błąd naprawiony
źródło
Miałem ten sam problem i tak się stało, ponieważ nacisnąłem klawisz Enter podczas dodawania kodu w ciągu tekstowym.
Ponieważ był to długi ciąg tekstu, chciałem to wszystko zobaczyć bez konieczności przewijania w edytorze tekstu, jednak naciśnięcie klawisza Enter dodawało niewidoczny znak do ciągu, co było nielegalne. Użyłem Sublime Text jako mojego edytora.
źródło
Zmieniłem wszystkie obszary kosmiczne na & nbsp, tak po prostu i zadziałało bez problemu.
Mam nadzieję, że to komuś pomoże.
źródło
Dodam jeszcze jedną odpowiedź do stosu. Ten problem może się zdarzyć również z powodu kodowania. Chcesz, aby kodowanie utf8 było bezpieczne. Niektóre edytory domyślnie używają utf16, co może powodować problemy. Jednym szybkim sposobem na przetestowanie tego jest, na przykład w kodzie VS, po prostu odtworzenie tej samej zawartości, ale użycie lokalnego edytora vscode do utworzenia pliku. Mam nadzieję, że to pomaga niektórym.
źródło