javascript - No hay causa visible para "Token inesperado ILEGAL"
syntax-error illegal-characters (10)
Estoy recibiendo este error de JavaScript en mi consola:
Error de sintaxis no detectado: token inesperado ILEGAL
Este es mi código:
var foo = ''bar'';
Es super simple, como puedes ver. ¿Cómo podría estar causando un error de sintaxis?
El error
Cuando el intérprete de JavaScript analiza el código, se rompe en partes llamadas "tokens". Cuando un token no puede clasificarse en uno de los cuatro tipos básicos de token , se etiqueta "ILEGAL" en la mayoría de las implementaciones, y se produce este error.
Se produce el mismo error si, por ejemplo, intenta ejecutar un archivo js con un carácter deshonesto @
, una llave mal colocada, corchete, "comillas inteligentes", comillas simples que no se incluyen correctamente (p this.run(''dev1)
Ej. this.run(''dev1)
) y así.
Muchas situaciones diferentes pueden causar este error. Pero si no tiene ningún error de sintaxis o carácter ilegal obvio, 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 de ancho cero de Unicode U+200B
(también ZWSP
como ZWSP
, entidad HTML ​
). Se sabe que ese carácter causa el error de sintaxis de Unexpected token ILLEGAL
JavaScript Unexpected token ILLEGAL
.
¿Y de dónde vino?
No puedo asegurarlo, pero mi apuesta está en jsfiddle . Si pega el código desde allí, es muy probable que incluya uno o más caracteres U+200B
. 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 el codepen. Aparentemente , tampoco está insertando
U+200B
por su cuenta, por lo que este problema debería ser menos frecuente de ahora en adelante.ACTUALIZACIÓN 2015-03-17
Vagrant parece que a veces también causa este problema, debido a un error en VirtualBox . La solución, según esta publicación del blog, es
sendfile off;
en su configuración nginx, oEnableSendfile Off
si usa Apache.
También se ha reported que el código pegado desde las herramientas de desarrollo 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 verlo?
El personaje es invisible, ¿cómo sabemos que está ahí? Puedes pedirle a tu editor que muestre caracteres invisibles. La mayoría de los editores de texto tienen esta característica. Vim, por ejemplo, los muestra de forma predeterminada, y el 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 envolver una cadena larga en la siguiente línea. Sin embargo, si no está al tanto de la presencia del personaje en su marca, puede convertirse en un problema. Si lo tiene dentro de una cadena (por ejemplo, el nodeValue
de nodeValue
de un elemento DOM que no tiene contenido visible), puede esperar que dicha cadena esté vacía, cuando en realidad no lo está (incluso después de aplicar String.trim
).
ZWSP
también puede causar que se muestren espacios en blanco adicionales en una página HTML, por ejemplo, cuando se encuentra entre dos elementos <div>
(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 por ejemplo, en latin1).
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
y U+200D
) en la Sección 7.1 , que dice que deben tratarse como IdentifierPart
s cuando "fuera de comentarios, literales de cadena y literales de expresión regular". Esos caracteres pueden, por ejemplo, ser parte de un nombre de variable (y var x/u200c;
hecho, funciona).
La Sección 7.2 enumera los caracteres de espacio en blanco válidos (como tabulación, espacio, espacio de no interrupción, etc.) y menciona vagamente que cualquier otro "separador de espacio" de Unicode (categoría "Zs") debe tratarse como espacio en blanco. Probablemente no sea 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 en realidad las implementaciones (al menos Chrome y Firefox) parecen tratarlas. como un token inesperado (o parte de uno), causando el error de sintaxis.
¿Por qué buscas este problema en tu código? Incluso, si es copypasted.
Si puede ver qué sucede exactamente después de guardar el archivo en la carpeta sincronizada, verá algo como *****
al final del archivo. No está relacionado con su código en absoluto.
Solución.
Si está utilizando nginx
en el cuadro errante, agregue a la configuración del servidor:
sendfile off;
Si está utilizando apache
en el cuadro errante, agregue a la configuración del servidor:
EnableSendfile Off;
Fuente del problema: VirtualBox Bug
Aquí está mi razón:
antes de:
var path = "D:/xxx/util.s"
que /u
es un escape, lo descubrí utilizando el análisis JS de Codepen .
después:
var path = "D://xxx//util.s"
y el error solucionado
Cambié todas las áreas de espacio a & nbsp, así de simple y funcionó sin problemas.
val.replace ("", "& nbsp");
Espero que esto ayude a alguien.
Cuando se ejecuta OS X, el sistema de archivos crea bifurcaciones ocultas de prácticamente todos sus archivos, si están en un disco duro que no admite HFS +. Esto puede a veces (me acaba de suceder) llevar a que el motor de JavaScript intente ejecutar la bifurcación de datos en lugar del código que pretende ejecutar. Cuando esto suceda, también recibirás
SyntaxError: Unexpected token ILLEGAL
porque la bifurcación de datos de su archivo contendrá el carácter Unicode U + 200B. Eliminar el archivo de la bifurcación de datos hará que su secuencia de comandos ejecute 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 (p. ej., volúmenes ufs, recursos compartidos de archivos de Windows, etc.). Cuando se copia un archivo Mac a dicho volumen, su bifurcación de datos se almacena bajo el nombre normal del archivo, y la información adicional de HFS (bifurcación de recursos, códigos de tipo y 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 concierne a OS-X, pero no a otros sistemas operativos; a veces esto puede ser molesto ...)
- Gordon Davisson @ http://www.westwind.com/reference/OS-X/invisibles.html
Esto también podría suceder 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 desde el PDF introduce algunos caracteres inesperados, ilegales e invisibles en el código.
Obtuve este error en Chrome cuando tuve 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 nginx + uwsgi setup vagrant, el problema principal es el error del cuadro virtual con el archivo de envío como se menciona en algunas de las respuestas. Sin embargo, para resolverlo, debe desactivar el archivo de envío tanto en nginx como en uwsgi.
En nginx.conf sendfile off
uwsgi application / config --disable-sendfile
Tuve el mismo problema en mi Mac y descubrí que era porque la Mac estaba reemplazando las comillas estándar por comillas rizadas que son caracteres javascript ilegales.
Para solucionar este problema, tuve que cambiar la configuración en mi mac Preferencias del sistema => Teclado => Texto (pestaña) para desmarcar el uso de comillas y guiones inteligentes (se verificó por defecto).
Tuve este mismo problema y ocurrió porque había pulsado la tecla Intro al agregar el 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 ingresar se agrega un carácter invisible a la cadena que era ilegal. Estaba usando Sublime Text como mi editor.