Non hai ningunha causa visible para o “token inesperado ilegal”


Cando o intérprete JavaScript analiza o código, está dividido en partes “tokens”. Cando un token non se pode clasificar nun dos catro tipos de tokens básicos, é “ilegal” na maioría das implementacións, e este erro é xerado.

O mesmo erro xérase se, por exemplo, proba Executando un ficheiro JS cun personaxe deshonesto, un lugar malo, un parénteses, “citas intelixentes”, citas simples non incluídas correctamente (por exemplo ), etc.

Moitas situacións diferentes poden causar este erro. Pero se non ten erros de sintaxe obvia ou carácter ilegal, pode ser causado por un carácter ilegal invisible. Isto é o que é esta resposta.

Pero non podo ver nada ilegal!

Hai un carácter invisible no código, Xusto despois do punto e coma. É o carácter de espazo unicode U+200B de ancho (tamén coñecido como ZWSP entidade html ​) .. Sábese que este personaxe causa o erro de sintaxe Javascript

Javascript.

e de onde veu?

Non podo dicir con certeza, pero a miña aposta está en JSFiddle. Se pegas o código desde alí, é moi probable que inclúa un ou máis caracteres

. Parece que a ferramenta usa ese personaxe para controlar a configuración de palabras en cadeas longas.

Actualización 2013-01-07

Dende a última actualización de JSFiddle, agora mostra o personaxe como un punto vermello como o codepen fai. Ao parecer, xa non está inserindo U+200B por si só, polo que este problema debe ser menos frecuente a partir de agora.

Actualización 2015-03-17

Vagabond parece que ás veces provoca este problema, debido a un erro en virtualbox. A solución, de acordo con esta publicación do blog, é definir sendfile off; na súa configuración de nginx ou EnableSendfile Off se usa Apache.

Tamén se informou de que o código atrapado das ferramentas de desenvolvedor de Chrome pode incluír ese personaxe, pero non puiden reproducirlo coa versión actual (22.0.1229.79 en OSX) .

Como podo detectarlo?

O personaxe é invisible, como sabemos que hai? Podes pedir ao teu editor a mostrar caracteres invisibles. A maioría dos editores de texto teñen esta función. Vim, por exemplo, mostra-los por defecto e ZWSP mostra como . Tamén podes depurarlo en liña: JSBIN mostra ao personaxe como un punto vermello nos teus paneis de código (pero parece que o elimina despois de gardar e recargar a páxina). Codepen.io tamén mostra-lo como un punto e mantén-lo mesmo despois de gardalo.

Problemas relacionados

Este personaxe non é algo malo, el realmente pode ser moi útil. Este exemplo en Wikipedia demostra como se pode usar para controlar onde unha longa cadea debe axustarse á seguinte liña. Non obstante, se non coñece a presenza do personaxe no seu marcado, pode converterse nun problema. Se o tes dentro dunha cadea (por exemplo, nodeValue dun elemento DOM que non ten contido visible), pode esperar que a cadea estea baleira, cando non sexa (ata Despois de aplicar String.trim).

ZWSP tamén se pode mostrar un espazo en branco adicional nunha páxina HTML, por exemplo , cando está entre dous elementos

(como se pode ver nesta pregunta). Este caso nin sequera reproducible en JSFiddde, xa que o personaxe ignórase alí.

Outro problema potencial: se a codificación do sitio web non é recoñecida como UTF-8, o personaxe pode ser amosado (como ​ en latino1, por exemplo).

Se ZWSP está presente no código CSS (código en liña ou un estilo externo folla), os estilos tampouco se poden analizar correctamente, polo que algúns estilos non se aplican (como se pode ver nesta pregunta).

Especificación de ecmascript

Non podo mencionar a esa específica carácter na especificación de ecmascript (versións 3 e 5.1). A versión actual menciona caracteres similares (U+200C e U+200D) na sección 7.1, que di que deben ser tratados como IdentifierPart s cando” fóra dos comentarios, literais de cadea e literais de expresión regular “. Estes personaxes poden, por exemplo, formar parte dun nome de variable (e de funciona).

Sección 7.2 Enumera os caracteres espazos en branco válidos (como a tabulación, o espazo, o espazo sen interrupción, etc.) e vagamente mencionan que calquera outro separador de espazo Unicode (categoría “ZS”) debe ser tratado como espazo en branco. Probablemente non son a mellor persoa para discutir as especificacións a este respecto, pero paréceme que U+200B debe considerarse un espazo en branco segundo isto, cando en realidade as implementacións (en Polo menos Chrome e Firefox) parecen tratalos como algo inesperado (ou parte dun), o que provoca o erro de sintaxe.

Deixa unha resposta

O teu enderezo electrónico non se publicará Os campos obrigatorios están marcados con *