No hay causa visible para el "token inesperado ILEGAL"


270

Recibo este error de JavaScript en mi consola:

SyntaxError no capturado: token inesperado ILEGAL

Este es mi código:

var foo = 'bar';​

Es súper simple, como puedes ver. ¿Cómo podría estar causando un error de sintaxis?


9
Para futuros lectores: si encontró este error al usar Vagrant, esta respuesta también puede ser útil: stackoverflow.com/questions/9479117/…
OZ_

En el caso de que esté experimentando esto en WordPress, ponga en cola los scripts de functions.php. Tenía una plantilla específica donde estaba solicitando el JS directamente desde la plantilla. Cambiar a una cola condicional en wp_head o wp_footer resolvió esto.
Alpesh Shah

77
Nota del moderador: borré un montón de respuestas aquí que en realidad no responden la pregunta. Esto no es, repito no , un lugar para enumerar todas las cosas posibles que puede hacer en JavaScript que dará lugar a este error. La pregunta tiene una circunstancia muy específica que no involucra ninguno de esos escenarios, y todos esos ejemplos simplemente no responden la pregunta.
animuson

3
Wow, la policía de SO tuvo un día de campo con esta pregunta. Afortunadamente, parte de la información relevante todavía es visible en las respuestas eliminadas.
Cdonner

Respuestas:


493

El error

Cuando el intérprete de JavaScript analiza el código, se divide en partes llamadas "tokens". Cuando un token no puede clasificarse en uno de los cuatro tipos de tokens básicos , se etiqueta como "ILEGAL" en la mayoría de las implementaciones, y se genera este error.

Se genera el mismo error si, por ejemplo, intenta ejecutar un archivo js con un @carácter deshonesto , una llave mal colocada, un paréntesis, "comillas inteligentes", comillas simples no incluidas correctamente (por ejemplo this.run('dev1)), etc.

Muchas situaciones diferentes pueden causar este error. Pero si no tiene ningún error de sintaxis obvio o carácter ilegal, puede ser causado por un carácter ilegal invisible . De eso se trata esta respuesta.

¡Pero no puedo ver nada ilegal!

Hay un carácter invisible en el código, justo después del punto y coma. Es el carácter de espacio Unicode U+200Bde ancho cero (también conocido como ZWSPentidad HTML ​). Se sabe que ese carácter causa el Unexpected token ILLEGALerror de sintaxis de JavaScript.

¿Y de dónde vino?

No puedo decir con certeza, pero mi apuesta está en jsfiddle . Si pega el código desde allí, es muy probable que incluya uno o más U+200Bcaracteres. Parece que la herramienta usa ese carácter para controlar el ajuste de palabras en cadenas largas.

ACTUALIZACIÓN 2013-01-07

Después de la última actualización de jsfiddle , ahora muestra al personaje como un punto rojo como lo hace codepen. Aparentemente , ya no está insertando U+200Bcaracteres por sí solo, por lo que este problema debería ser menos frecuente a partir de ahora.

ACTUALIZACIÓN 2015-03-17

Vagabundo parece causar a veces este problema también, debido a un error en VirtualBox . La solución, según esta publicación de blog, es establecer sendfile off;en su configuración nginx, o EnableSendfile Offsi usa Apache.

También se informó que el código pegado de las herramientas de desarrollador de Chrome puede incluir ese carácter, pero no pude reproducirlo con la versión actual (22.0.1229.79 en OSX).

¿Cómo puedo detectarlo?

El personaje es invisible, ¿cómo sabemos que está allí? Puede pedirle a su editor que muestre caracteres invisibles. La mayoría de los editores de texto tienen esta característica. Vim, por ejemplo, los muestra por defecto, y los ZWSPmuestra como <u200b>. También puede depurarlo en línea: jsbin muestra el carácter como un punto rojo en sus paneles de código (pero parece eliminarlo después de guardar y volver a cargar la página). CodePen.io también lo muestra como un punto y lo mantiene incluso después de guardarlo.

Problemas relacionados

Ese personaje no es algo malo, en realidad puede ser bastante útil. Este ejemplo en Wikipedia demuestra cómo se puede usar para controlar dónde se debe ajustar una cadena larga a la siguiente línea. Sin embargo, si desconoce la presencia del personaje en su marcado, puede convertirse en un problema. Si lo tiene dentro de una cadena (por ejemplo, la nodeValuede un elemento DOM que no tiene contenido visible), puede esperar que dicha cadena esté vacía, cuando de hecho no lo está (incluso después de aplicar String.trim).

ZWSPTambién puede hacer que se muestre un espacio en blanco adicional en una página HTML, por ejemplo, cuando se encuentra entre dos <div>elementos (como se ve en esta pregunta ). Este caso ni siquiera es reproducible en jsfiddle, ya que el personaje se ignora allí.

Otro problema potencial: si la codificación de la página web no se reconoce como UTF-8, el carácter puede mostrarse (como ​en latin1, por ejemplo).

Si ZWSPestá presente en el código CSS (código en línea o una hoja de estilo externa), los estilos tampoco se pueden analizar correctamente, por lo que algunos estilos no se aplican (como se ve en esta pregunta ).

La especificación ECMAScript

No pude encontrar ninguna mención a ese carácter específico en la especificación ECMAScript (versiones 3 y 5.1 ). La versión actual menciona caracteres similares ( U+200Cy U+200D) en la Sección 7.1 , que dice que deberían tratarse como IdentifierParts cuando "fuera de los comentarios, los literales de cadena y los literales de expresión regular". Esos caracteres pueden, por ejemplo, ser parte de un nombre de variable (y de var x\u200c;hecho funciona).

La Sección 7.2 enumera los caracteres de espacio en blanco válidos (como tabulación, espacio, espacio sin interrupción, etc.) y menciona vagamente que cualquier otro "separador de espacio" Unicode (categoría "Zs") debe tratarse como espacio en blanco. Probablemente no soy la mejor persona para discutir las especificaciones a este respecto, pero me parece que U+200Bdebería considerarse un espacio en blanco de acuerdo con eso, cuando de hecho las implementaciones (al menos Chrome y Firefox) parecen tratarlas como algo inesperado token (o parte de uno), que causa el error de sintaxis.


codepen.io también parece mostrar este personaje. VIM y VI, también notepad ++ lo muestra.
rlemon

Gracias @rlemon, agregó un ejemplo de CodePen a la respuesta. Bonito sitio, no lo sabía.
bfavaretto

Encontré este mismo problema al copiar / pegar código para la clase testTwo de esta pregunta SO usando Chromium. Aparentemente, el analizador se atragantó con el resaltado de sintaxis de la functionpalabra clave, que era invisible en Vim hasta que lo resalté usando el método de preguntas frecuentes "Resaltar todos los caracteres no imprimibles". Ahh, sería tan bueno si hubiera una manera de copiar solo caracteres en el rango de 32..127 (pero probablemente haya una aplicación para eso :))
ack

1
@bfavaretto, solo en el fragmento de código en modo de edición. No en el cuerpo de la pregunta, debería haber mencionado esto. (Probado en Chrome 43.0.2357.124 m)
Fernando Leal

1
Muchos editores de texto permiten cambiar la codificación de caracteres de un archivo. Esto es tremendamente útil para encontrar personajes ofensivos como estos. Mi solución fue cambiar temporalmente de UTF-8 a una codificación ANSI, eliminar los caracteres no válidos y luego volver a cambiar. Usé el freeware Notepad ++ en Windows. EDITAR: resulta que me perdí la opción Notepad ++ para "Mostrar todos los caracteres" Mismo resultado, menos problemas: D
mbargiel

64

¿Por qué buscas este problema en tu código? Incluso, si es copiado.

Si puede ver, qué sucede exactamente después de guardar el archivo en la carpeta sincronizada: verá algo así *****al final del archivo. No está relacionado con su código en absoluto.

Solución.

Si está utilizando un nginxcuadro vagabundo, agregue a la configuración del servidor:

sendfile off;

Si está utilizando un apachecuadro vagabundo, agregue a la configuración del servidor:

EnableSendfile Off;

Fuente del problema: error de VirtualBox


66
Literalmente me salvaste el día. He luchado con Nginx + Vagrant durante toda una noche, y esto lo resolvió.
fradeve

2
Did NO esperes que es la respuesta correcta (para mí) pero era, muchas gracias.
Charlotte

2
En realidad, dejó de funcionar. Por otra parte, hay varias capas de simbología en juego aquí, así que simplemente deshice lo que pude.
Charlotte

Gracias. Estaba en una caja vagabunda con nginx. También he visto este problema en configuraciones similares de Apache.
Cameron

para apache: EnableSendfile Off
jamlee

7

Esto también podría estar sucediendo si está copiando el código de otro documento (como un PDF) en su consola y está intentando ejecutarlo.

Estaba tratando de ejecutar algún código de ejemplo de un libro de Javascript que estoy leyendo y me sorprendió que no se ejecutara en la consola.

Aparentemente, copiar del PDF introduce algunos caracteres inesperados, ilegales e invisibles en el código.


5

Tuve el mismo problema en mi Mac y descubrí que era porque la Mac estaba reemplazando las comillas estándar con comillas rizadas que son caracteres ilegales de JavaScript.

Para solucionar esto, tuve que cambiar la configuración en mi Mac Preferencias del sistema => Teclado => Texto (pestaña) desmarque el uso de comillas y guiones inteligentes (se marcó el valor predeterminado).


5

Obtuve este error en Chrome cuando tenía una cadena sin terminar después de la línea a la que apuntaba el error. Después de cerrar la cadena, el error desapareció.

Ejemplo con error:

var file = files[i]; // SyntaxError: Unexpected token ILLEGAL

jQuery('#someDiv').innerHTML = file.name + " (" + formatSize(file.size) + ") "
    + "<a href=\"javascript: something('"+file.id+');\">Error is here</a>";

Ejemplo sin error:

var file = files[i]; // No error

jQuery('#someDiv').innerHTML = file.name + " (" + formatSize(file.size) + ") "
    + "<a href=\"javascript: something('"+file.id+"');\">Error was here</a>";

2
Tuve que ejecutar un diff en sus dos ejemplos para descubrir la diferencia, y una vez que lo hice, inmediatamente descubrí mi propio problema.
Ben Harold

3

Si está ejecutando un programa de instalación nginx + uwsgi, entonces el problema principal es el error de la caja virtual con el archivo de envío como se menciona en algunas de las respuestas. Sin embargo, para resolverlo, debe deshabilitar sendfile en nginx y uwsgi.

  1. En nginx.conf sendfile apagado

  2. uwsgi application / config --disable-sendfile


2

Al ejecutar OS X, el sistema de archivos crea bifurcaciones ocultas de básicamente todos sus archivos, si están en un disco duro que no es compatible con HFS +. Esto a veces (me sucedió hace un momento) puede llevar a que su motor JavaScript intente ejecutar la bifurcación de datos en lugar del código que pretende ejecutar. Cuando esto suceda, también recibirá

SyntaxError: Unexpected token ILLEGAL

porque la bifurcación de datos de su archivo contendrá el carácter Unicode U + 200B. Al eliminar el archivo de la bifurcación de datos, su secuencia de comandos ejecutará su código real previsto, en lugar de una bifurcación de datos binarios de su código.

. lo que sea: estos archivos se crean en volúmenes que no admiten de forma nativa las características completas de los archivos HFS (por ejemplo, volúmenes ufs, archivos compartidos de Windows, etc.). Cuando se copia un archivo Mac en dicho volumen, su bifurcación de datos se almacena con el nombre normal del archivo, y la información adicional de HFS (bifurcación de recursos, tipo y códigos de creador, etc.) se almacena en un segundo archivo (en formato AppleDouble), con un nombre que comienza con ". " (Estos archivos son, por supuesto, invisibles en lo que respecta a OS-X, pero no a otros sistemas operativos; esto a veces puede ser molesto ...)


1

Aquí está mi razón:

antes de:

var path = "D:\xxx\util.s"

lo cual \ues un escape, lo descubrí usando el análisis de Codepen JS.

después:

var path = "D:\\xxx\\util.s"

y el error solucionado


0

Tuve este mismo problema y ocurrió porque presioné la tecla Intro al agregar código en una cadena de texto.

Debido a que era una larga cadena de texto, quería verlo todo sin tener que desplazarme en mi editor de texto, sin embargo, al presionar enter, se agregó un carácter invisible a la cadena que era ilegal. Estaba usando Sublime Text como mi editor.


0

Cambié todas las áreas de espacio a & nbsp, así como así y funcionó sin problemas.

val.replace ("", "& nbsp");

Espero que esto ayude a alguien.


0

Voy a agregar una respuesta más a la pila. Este problema podría ocurrir también debido a la codificación. Desea que la codificación utf8 esté segura. Algunos editores usan por defecto utf16 que puede causar problemas. Una forma rápida de probar esto es, por ejemplo, en el código VS, simplemente recrear el mismo contenido pero usar el editor local de vscode para crear el archivo. Espero que esto ayude un poco.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.