Não há causa visível para o “token inesperado ilegal”


Erro

Quando o intérprete JavaScript analisa o código, ele é dividido em peças “tokens”. Quando um token não pode ser classificado em um dos quatro tipos de tokens básicos, é “ilegal” na maioria das implementações, e esse erro é gerado.

O mesmo erro é gerado se, por exemplo, tente Executando um arquivo JS com um personagem , um lugar ruim, um parênteses, “citações inteligentes”, cotações simples não incluídas corretamente (por exemplo, this.run('dev1)), etc.

Muitas situações diferentes podem causar esse erro. Mas se você não tiver nenhum erro de sintaxe óbvia ou personagem ilegal, ele pode ser causado por um caractere ilegal invisível. É isso que esta resposta é sobre.

mas eu não posso ver nada ilegal!

Há um caractere invisível no código, logo após o ponto e coma. É o caractere de espaço do Unicode U+200B zero (também conhecido como ZWSP entidade html ​) . Sabe-se que este caractere faz com que o erro Unexpected token ILLEGAL

e de onde ele veio?

não posso dizer com Certeza, mas minha aposta está no JSFiddle. Se você colar o código de lá, é muito provável que você inclua um ou mais caracteres U+200B Parece que a ferramenta usa esse caractere para controlar a configuração de palavras em cadeias longas.

Atualização 2013-01-07

A partir da última atualização do JSFiddle, agora mostra o personagem como um ponto vermelho como Codepen. Aparentemente, não está mais inserindo U+200B Personagens por si só, portanto, esse problema deve ser menos frequente a partir de agora.

Atualização 2015-03-17

vagabundo parece, às vezes, causar esse problema, devido a um erro no VirtualBox. A solução, de acordo com esta postagem do blog, é definir sendfile off; em sua configuração Nginx, ou EnableSendfile Off Se você usar o Apache.

Também foi relatado que o código preso das ferramentas do desenvolvedor do Chrome pode incluir esse caractere, mas não consegui reproduzi-lo com a versão atual (22.0.1229.79 no OSX) .

Como posso detectá-lo?

O personagem é invisível, como sabemos o que há? Você pode pedir ao seu editor para exibir caracteres invisíveis. A maioria dos editores de texto tem esse recurso. O VIM, por exemplo, mostra-lhes por padrão, e o ZWSP mostra como <u200b>. Você também pode depurar on-line: o JSBIN mostra o caractere como um ponto vermelho em seus painéis de código (mas parece excluí-lo após salvar e recarregar a página). O CodePen.Io também mostra como um ponto e o mantém mesmo depois de salvá-lo.

Problemas relacionados

Esse caractere não é uma coisa ruim, pode ser realmente útil. Este exemplo na Wikipedia demonstra como ele pode ser usado para controlar onde uma longa cadeia deve ser ajustada para a próxima linha. No entanto, se você não conhece a presença do personagem em sua marcação, você pode se tornar um problema. Se você tiver dentro de uma string (por exemplo, o nodeValue de um elemento DOM que não tem conteúdo visível), você pode esperar que essa corrente esteja vazia, quando não é (mesmo Depois de aplicar String.trim <

ZWSP Também pode ser exibido um espaço em branco adicional em uma página HTML, por exemplo , quando é entre dois elementos <div> (como visto nesta questão). Este caso não é mesmo reproduzível no JSFiddle, já que o personagem é ignorado lá.

Outro problema potencial: Se a codificação do site não for reconhecida como UTF-8, o caractere pode ser exibido (como ​ In Latin1, por exemplo).

Se ZWSP está presente no código CSS (código on-line ou um estilo externo folha), estilos não podem ser analisados adequadamente, então alguns estilos não se aplicam (como visto nesta questão).

ECMAScript Especificação

Não consigo encontrar nenhuma menção a esse específico caractere na especificação ECMAScript (versões 3 e 5.1). A versão atual menciona caracteres semelhantes ( e U+200D) na seção 7.1, que diz que devem ser tratados como IdentifierPart s quando” fora dos comentários, literais de cadeia e literais de expressão regular “. Esses caracteres podem, por exemplo, fazer parte de um nome variável (e de var x\u200c; Fato funciona).

seção 7.2 Lista os caracteres de espaço em branco válidos (como tabulação, espaço, espaço sem interrupção, etc.) e mencionar vagamente que qualquer outro separador de espaço Unicode (categoria “zs”) deve ser tratado como espaço em branco. Eu provavelmente não sou a melhor pessoa para discutir as especificações a esse respeito, mas parece-me que U+200B deve ser considerado um espaço em branco de acordo com isso, quando na verdade as implementações (em menos cromo e firefox) parecem tratá-los como algo inesperado token (ou parte de um), o que causa o erro de sintaxe.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *