No hay causa visible para " token inesperado ILEGAL"


Estoy recibiendo 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?

Author: Fernando Leal, 2012-10-04

10 answers

El error

Cuando el código es analizado por el intérprete de JavaScript, se rompe en pedazos llamados "tokens". Cuando un token no se puede clasificar en uno de los cuatro tipos básicos de token, se etiqueta "ILEGAL" en la mayoría de las implementaciones, y se lanza este error.

El mismo error se produce si, por ejemplo, intenta ejecutar un archivo js con un carácter rogue @, un corsé rizado extraviado, corchete, "comillas inteligentes", comillas simples no encerradas correctamente (p. ej. this.run('dev1)) y así sucesivamente.

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 Unicode U+200B Espacio de ancho cero (también conocido como ZWSP, entidad HTML ​). Se sabe que ese carácter causa el error de sintaxis de JavaScript Unexpected token ILLEGAL.

¿Y de dónde vino?

No puedo decirlo con seguridad, pero mi apuesta está en jsfiddle. Si pegas 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 se está mostrando el carácter como un punto rojo como lo hace codepen. Aparentemente, tampoco 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

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

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

¿Cómo puedo detectarlo?

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 ZWSP se muestra como <u200b>. Usted también puede depurar 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 recargar la página). CodePen.io también lo muestra como un punto, y lo mantiene incluso después de guardarlo.

Problemas relacionados

Ese carácter no es algo malo, en realidad puede ser bastante útil. Este ejemplo en Wikipedia demuestra cómo se puede usar para controlar dónde una cadena larga debe ser envuelta en la siguiente línea. Sin embargo, si no eres consciente de la presencia del personaje en tu marcado, puede convertirse en un problema. Si lo tiene dentro de una cadena (por ejemplo, el 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 hacer 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 no es ni siquiera reproducible en jsfiddle, ya que el carácter es ignorado allí.

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

Si ZWSP está presente en el código CSS (código en línea o una hoja de estilos 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

I no se pudo 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 Sección 7.1, que dice que deben ser tratados como IdentifierPart cuando "fuera de los 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; de hecho funciona).

La sección 7.2 enumera las Caracteres de espacio en blanco(como tabulación, espacio, espacio sin interrupción, etc.), y menciona vagamente que cualquier otro "separador de espacio" Unicode (categoría "Zs") debe ser tratado como espacio en blanco. Probablemente no soy la mejor persona para discutir las especificaciones en este sentido, pero me parece que U+200B debe considerarse espacio en blanco de acuerdo con eso, cuando de hecho las implementaciones (al menos Chrome y Firefox) parecen tratarlos como un token inesperado (o parte de uno), causando el error de sintaxis.

 484
Author: bfavaretto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:47

¿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 tu código en absoluto.

Solución.

Si está usando nginx en vagrant box - agregue a la configuración del servidor:

sendfile off;

Si está usando apache en vagrant box - agregue a la configuración del servidor:

EnableSendfile Off;

Fuente del problema: Error de VirtualBox

 62
Author: Nikolay Fominyh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-22 23:35:20

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

Estaba tratando de ejecutar un 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.

 6
Author: Kyle Pennell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-28 16:10:40

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>";
 5
Author: Ozzy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-20 16:22:05

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 javascript ilegales.

Para arreglar esto tuve que cambiar la configuración en mi mac Preferencias del sistema=>Teclado=>Texto(tab) desmarque usar comillas y guiones inteligentes (el valor predeterminado estaba marcado).

 4
Author: user3360944,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-02 13:46:42

Si está ejecutando un vagrant de configuración nginx + uwsgi, 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 tanto en nginx como en uwsgi.

  1. En nginx.conf sendfile off

  2. Aplicación Uwsgi / configuración -- disable-sendfile

 3
Author: msrivas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-23 19:39:57

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

SyntaxError: Unexpected token ILLEGAL

Porque la bifurcación de datos de su archivo contendrá el carácter Unicode U+200B. La eliminación del archivo de bifurcación de datos hará que su script ejecute su, código 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 características completas de archivos HFS (por ejemplo, volúmenes ufs, archivos compartidos de Windows, etc.). Cuando un archivo Mac se copia a dicho volumen, su bifurcación de datos se almacena bajo el nombre normal del archivo, y la información HFS adicional (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 respecta a OS-X, pero no para otros sistemas operativos; esto a veces puede ser molesto...)

 2
Author: Spcaeyob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-15 15:09:11

Tuve este mismo problema y ocurrió porque había presionado la tecla enter al agregar código en una cadena de texto.

Debido a que era una cadena larga de texto, quería verlo todo sin tener que desplazarse 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
Author: Jordan Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-11 18:58:13

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

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

Espero que ayude a alguien.
 0
Author: Erdogan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-25 07:13:56

Aquí está mi razón:

Antes:

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

Que \u es un escape, lo descubrí usando Codepen's analizar JS.

Después de:

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

Y el error corregido

 0
Author: Miao1007,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-09 14:22:55