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?
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?
Respuestas:
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.
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 como ZWSP
entidad HTML ​
). Se sabe que ese carácter causa el Unexpected token ILLEGAL
error de sintaxis de JavaScript.
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.
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+200B
caracteres 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, oEnableSendfile Off
si 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).
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.
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 aplicar String.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 ).
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
y U+200D
) en la Sección 7.1 , que dice que deberían tratarse como IdentifierPart
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 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+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.
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:
sendfile off;
Si está utilizando un apache
cuadro vagabundo, agregue a la configuración del servidor:
EnableSendfile Off;
Fuente del problema: error de VirtualBox
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.
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).
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>";
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
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 ...)
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.
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.