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?
javascript
syntax-error
illegal-characters
bfavaretto
fuente
fuente
Respuestas:
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 ejemplothis.run('dev1)
), etc.¡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+200B
de ancho cero (también conocido comoZWSP
entidad HTML​
). Se sabe que ese carácter causa elUnexpected token ILLEGAL
error 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+200B
caracteres. Parece que la herramienta usa ese carácter para controlar el ajuste de palabras en cadenas largas.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
ZWSP
muestra 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
nodeValue
de 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 aplicarString.trim
).ZWSP
Tambié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
ZWSP
está 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+200C
yU+200D
) en la Sección 7.1 , que dice que deberían tratarse comoIdentifierPart
s 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 devar 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+200B
deberí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.fuente
function
palabra 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 :))¿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
nginx
cuadro vagabundo, agregue a la configuración del servidor:Si está utilizando un
apache
cuadro vagabundo, agregue a la configuración del servidor:Fuente del problema: error de VirtualBox
fuente
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.
fuente
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).
fuente
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:
Ejemplo sin error:
fuente
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.
En nginx.conf sendfile apagado
uwsgi application / config --disable-sendfile
fuente
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á
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.
fuente
Aquí está mi razón:
antes de:
lo cual
\u
es un escape, lo descubrí usando el análisis de Codepen JS.después:
y el error solucionado
fuente
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.
fuente
Cambié todas las áreas de espacio a & nbsp, así como así y funcionó sin problemas.
Espero que esto ayude a alguien.
fuente
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.
fuente