Non vi è alcuna causa visibile per il “Token inatteso illegale”


Quando l’interprete JavaScript analizza il codice, è diviso in parti “token”. Quando un token non può essere classificato in uno dei quattro tipi di token di base, è “illegale” nella maggior parte delle implementazioni e questo errore viene generato.

Lo stesso errore viene generato se, per esempio, prova Esecuzione di un file JS con un carattere disonesto, un brutto posto, parentesi, “preventivi intelligenti”, citazioni semplici non incluse correttamente (ad esempio this.run('dev1)), ecc.

Molte diverse situazioni possono causare questo errore. Ma se non si dispone di errori di sintassi ovvio o carattere illegale, può essere causato da un carattere illegale invisibile. Questo è ciò di cui questa risposta è.

Ma non riesco a vedere nulla di illegale!

C’è un carattere invisibile nel codice, Subito dopo il punto e il coma. È il carattere spaziale Unicode U+200B Ampio (noto anche come ZWSP Entità HTML ​) . È noto che questo personaggio provoca Unexpected token ILLEGAL Errore di sintassi JavaScript.

e da dove viene?

Non posso dire con Certezza ma la mia scommessa è su Jsfiddle. Se incolla il codice da lì, è molto probabile che tu includa uno o più U+200B caratteri. Sembra che lo strumento usa quel personaggio per controllare l’impostazione delle parole in catene lunghe.

Aggiornamento 2013-01-07

Dal ultimo aggiornamento Jsfiddle, ora mostra il personaggio come un punto rosso come lo fa Codepen. Apparentemente, non è più inserisce U+200B caratteri di per sé, quindi questo problema dovrebbe essere meno frequente da ora in poi.

Aggiornamento 2015-03-17

Vagabond sembra a volte causare anche questo problema, a causa di un errore in VirtualBox. La soluzione, secondo questo post del blog, è impostare sendfile off; nella sua configurazione Nginx o EnableSendfile Off se si utilizza Apache.

È stato anche riferito che il codice bloccato degli strumenti per sviluppatori Chrome può includere quel personaggio, ma non potevo riprodurlo con la versione corrente (22.0.1229.79 in OSX) .

Come posso rilevarlo?

Il personaggio è invisibile, come sappiamo cosa c’è? Puoi chiedere al tuo editore di visualizzare caratteri invisibili. La maggior parte degli editori di testo ha questa funzione. Vim, ad esempio, mostrarli per impostazione predefinita e ZWSP mostra come <u200b>. Puoi anche eseguire il debug online: Jsbin mostra il personaggio come un punto rosso sui pannelli di codice (ma sembra eliminarlo dopo aver salvato e ricaricato la pagina). Codepen.io Lo mostra anche come un punto e lo tiene anche dopo averlo salvato.

Problemi correlati

Quel carattere non è una brutta cosa, può effettivamente essere abbastanza utile. Questo esempio in Wikipedia dimostra come può essere utilizzato per controllare dove una stringa lunga deve essere regolata alla riga successiva. Tuttavia, se non conosci la presenza del personaggio nella marcatura, puoi diventare un problema. Se ce l’hai all’interno di una stringa (ad esempio, il nodeValue di un elemento DOM che non ha contenuti visibili), puoi aspettarti che la catena sia vuota, quando non è (anche Dopo aver applicato String.trim).

ZWSP può anche essere visualizzato uno spazio vuoto aggiuntivo in una pagina HTML, ad esempio , quando è tra due <div> elementi (come visto in questa domanda). Questo caso non è nemmeno riproducibile in Jsfiddle, poiché il personaggio viene ignorato lì.

Un altro problema potenziale: se la codifica del sito Web non è riconosciuta come UTF-8, il carattere può essere visualizzato (come ​ in Latin1, ad esempio).

se ZWSP è presente nel codice CSS (codice online o uno stile esterno foglio), gli stili non possono essere analizzati correttamente, quindi alcuni stili non si applicano (come visto in questa domanda).

specifica di ecmascript

Non riesco a trovare alcuna menzione a quella specifica Carattere nelle specifiche EcmaScript (versioni 3 e 5.1). La versione corrente menziona caratteri simili (U+200C e U+200D) nella sezione 7.1, che dice che dovrebbero essere trattati come IdentifierPart s quando” fuori dai commenti, i letterali della catena e i letterali di espressione regolare “. Questi caratteri possono, ad esempio, parte di un nome variabile (e da lavori fatti).

Sezione 7.2 Elenca i caratteri spaziali vuoti validi (come la tabulazione, lo spazio, lo spazio senza interruzione, ecc.) E menzionare vagamente che qualsiasi altro separatore spaziale Unicode (Categoria “ZS”) deve essere considerato come spazio vuoto. Probabilmente non sono la persona migliore per discutere le specifiche in questo senso, ma mi sembra che U+200B dovrebbe essere considerato uno spazio vuoto in base a ciò, quando infatti le implementazioni (a Minima cromatura e firefox) sembra trattarli come qualcosa di imprevisto token (o parte di uno), che causa l’errore di sintassi.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *