Нет видимой причины для "Неожиданного токена ILLEGAL"

Я получаю эту ошибку JavaScript на консоли:

Uncaught SyntaxError: Неожиданный токен ILLEGAL

Это мой код:

var foo = 'bar';​

Ответ 1

Ошибка

Когда код анализируется интерпретатором JavaScript, он разбивается на части, называемые "токенами". Когда токен не может быть классифицирован в один из четырех основных типов токенов, он становится помеченным как "НЕЗАКОННЫЙ" в большинстве реализаций, и эта ошибка возникает.

Такая же ошибка возникает, если, например, вы пытаетесь запустить js файл с символом "rogue @", неуместной фигурной скобкой, скобкой, "умными кавычками", одинарными кавычками, не прилагаемыми должным образом (например, this.run('dev1)) и т.д.

Многие ошибки могут вызвать эту ошибку. Но если у вас нет очевидной синтаксической ошибки или незаконного символа, это может быть вызвано невидимым незаконным символом. Вот о чем этот ответ.

Но я не вижу ничего незаконного!

В коде есть невидимый символ, сразу после точки с запятой. Это символ Unicode U+200B Zero width width (a.k.a. ZWSP, объект HTML ​). Известно, что этот символ вызывает синтаксическую ошибку Unexpected token ILLEGAL JavaScript.

И откуда оно взялось?

Я не могу точно сказать, но моя ставка находится на jsfiddle. Если вы вставляете код оттуда, он может включать один или несколько символов U+200B. Кажется, что этот инструмент использует этот символ для управления переносом слов на длинных строках.

ОБНОВЛЕНИЕ 2013-01-07

После последнего jsfiddle update, теперь он показывает персонажа как красная точка, как кодекс. По-видимому, он также не вставляет символы U+200B сам по себе, поэтому эта проблема должна быть менее частым с этого момента.

ОБНОВЛЕНИЕ 2015-03-17

Vagrant, похоже, иногда вызывает и эту проблему из-за ошибки в VirtualBox. Решение, согласно это сообщение в блоге, должно установить sendfile off; в вашей конфигурации nginx или EnableSendfile Off, если вы используете Apache.

Он также был сообщил, что код, вставленный из инструментов разработчика Chrome, может включать этот символ, но я не смог воспроизвести его с текущей версией (22.0.1229.79 on OSX).

Как это определить?

Символ невидим, как мы его знаем? Вы можете попросить своего редактора показать невидимые персонажи. Большинство текстовых редакторов имеют эту функцию. Например, Vim отображает их по умолчанию, а ZWSP отображается как <u200b>. Вы также можете отладить его через Интернет: jsbin отображает символ как красную точку на своих кодовых панелях (но, кажется, удаляет его после сохранения и перезагрузки страница). CodePen.io также отображает его как точку и сохраняет его даже после сохранения.

Связанные проблемы

Этот персонаж не является чем-то плохим, он может быть весьма полезным. Этот пример в Википедии демонстрирует, как его можно использовать для управления тем, где длинная строка должна быть перенесена на следующую строку. Однако, если вы не знаете о присутствии персонажа в вашей разметке, это может стать проблемой. Если у вас есть внутри строки (например, nodeValue элемента DOM, у которого нет видимого содержимого), вы можете ожидать, что такая строка будет пустой, а на самом деле это не так (даже после применения String.trim).

ZWSP также может вызывать добавление лишнего пробела на HTML-странице, например, когда он обнаруживается между двумя элементами <div> (как показано на этом вопросе). Этот случай даже не воспроизводится на jsfiddle, так как символ там игнорируется.

Другая потенциальная проблема: если кодировка веб-страницы не распознается как UTF-8, символ может фактически отображаться (например, ​ в latin1).

Если ZWSP присутствует в коде CSS (встроенный код или внешняя таблица стилей), стили также не могут быть правильно проанализированы, поэтому некоторые стили не применяются (как показано на этот вопрос).

Спецификация ECMAScript

Я не мог найти упоминания об этом конкретном символе в спецификации ECMAScript (версии 3 и 5.1). В текущей версии упоминаются похожие символы (U+200C и U+200D) на Раздел 7.1, в котором говорится, что они должны рассматриваться как IdentifierPart, когда "вне комментариев, строковых литералов и литералов регулярных выражений". Эти символы могут, например, быть частью имени переменной (и var x\u200c; действительно работает).

Раздел 7.2 перечисляет допустимые символы пробела (такие как вкладка, пробел, пробел и т.д.), и смутно упоминает, что любой другой "разделитель пространства" Unicode (категория "Zs" ) следует рассматривать как пробел. Я, вероятно, не лучший человек, чтобы обсудить спецификации в этом отношении, но мне кажется, что U+200B следует рассматривать как свободное пространство в соответствии с этим, когда на самом деле реализации (по крайней мере, Chrome и Firefox), похоже, относятся к ним как неожиданный токен (или его часть), вызывая синтаксическую ошибку.

Ответ 2

почему вы ищете эту проблему в своем коде? Даже если оно копируется.

Если вы видите, что именно происходит после сохранения файла в синхронизированной папке, вы увидите что-то вроде ***** в конце файла. Это никак не связано с вашим кодом.

Решение.

Если вы используете nginx в бродячем поле - добавьте в конфигурацию сервера:

sendfile off;

Если вы используете apache в бродячем поле - добавьте в конфигурацию сервера:

EnableSendfile Off;

Источник проблемы: Ошибка VirtualBox

Ответ 3

Это также может происходить, если вы копируете код из другого документа (например, PDF) в консоль и пытаетесь запустить его.

Я пытался запустить некоторый пример кода из книги Javascript, которую я читал, и был удивлен, что он не запускался в консоли.

По-видимому, копирование из PDF вводит в код некоторые неожиданные, незаконные и невидимые символы.

Ответ 4

Я получил эту ошибку в chrome, когда у меня была строка без прерывания после строки, на которую указывала ошибка. После закрытия строки ошибка исчезла.

Пример с ошибкой:

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>";

Пример без ошибок:

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

У меня была та же проблема на моем mac и нашлось, что это было потому, что Mac заменял стандартные кавычки курчавыми цитатами, которые являются незаконными символами javascript.

Чтобы исправить это, мне пришлось изменить настройки на моем компьютере. Настройки системы = > Клавиатура = > Текст (вкладка) снимите флажок с помощью смарт-кавычек и тире (по умолчанию был отмечен).

Ответ 6

Если вы используете настройку nginx + uwsgi vagrant, то основной проблемой является ошибка виртуального окна с файлом отправки, как указано в некоторых ответах. Однако для его устранения вы должны отключить sendfile как в nginx, так и в uwsgi.

  • В nginx.conf sendfile off

  • uwsgi application/config --disable-SendFile

Ответ 7

При работе с ОС X файловая система создает скрытые вилки в основном всех ваших файлов, если они находятся на жестком диске, который не поддерживает HFS+. Иногда это может произойти (произошло со мной сейчас), и ваш движок JavaScript пытается запустить вилку данных вместо кода, который вы собираетесь запустить. Когда это произойдет, вы также получите

SyntaxError: Unexpected token ILLEGAL

потому что данные fork вашего файла будут содержать символ Unicode U + 200B. Удаление файла данных fork приведет к тому, что ваш script запускает ваш фактический, предназначенный код вместо бинарных данных для вашего кода.

. безотносительно: эти файлы создаются на томах, которые не поддерживают полностью характеристики HFS файла (например, тома ufs, файлы Windows и т.д.). Когда Mac файл копируется на такой том, его вилка данных хранится под обычным именем файла, а дополнительная информация HFS (ресурс fork, тип и код создателя и т.д.) Хранится во втором файле (в формате AppleDouble), с именем, которое начинается с ".". (Эти файлы, конечно же, невидимы для OS-X, но не для других ОС, иногда это может раздражать...)

Ответ 8

У меня была такая же проблема, и это произошло потому, что я нажал клавишу ввода при добавлении кода в текстовую строку.

Поскольку это была длинная строка текста, я хотел увидеть все это, не прокручивая текст в текстовом редакторе, однако попадание в него добавило невидимый символ в строку, которая была незаконной. Я использовал Sublime Text в качестве своего редактора.

Ответ 9

Я изменил все области пространства на & nbsp, как раз так, и он работал без проблем.

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

Я надеюсь, что это поможет кому-то.

Ответ 10

Вот моя причина:

перед:

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

который \u является побегом, я понял это с помощью Codepen проанализировать JS.

после:

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

и исправленная ошибка