Нет видимой причины для " Unexpected token ILLEGAL"

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

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

Это мой код:

var foo = 'bar';​

это очень просто, как вы можете видеть. Как это может быть причиной синтаксической ошибки?

10 ответов


ошибка

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

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

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

но я не вижу ничего противозаконного!

в коде есть невидимый символ, сразу после точки с запятой. Это Юникод U+200B нулевой ширины пространства символ (a.к. a. ZWSP, HTML entity ​). Этот персонаж вызывает Unexpected token ILLEGAL синтаксическая ошибка JavaScript.

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

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

обновление 2013-01-07

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

обновления 2015-03-17

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

также об этом сообщает этот код, вставленный из инструментов разработчика Chrome, может включать этот символ, но я не смог воспроизвести его с текущей версией (22.0.1229.79 на 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) on 7.1, который говорит, что они должны рассматриваться как IdentifierParts, когда "вне комментариев, строковых литералов и литералов регулярных выражений". Эти символы могут, например, быть частью имени переменной (и var x\u200c; действительно работает).

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


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

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

решение.

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

sendfile off;

если вы используете apache in vagrant box-добавить на сервер config:

EnableSendfile Off;

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


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

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

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


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

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

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

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

чтобы исправить это, мне пришлось изменить настройки на моем mac System Preferences= > Keyboard=>Text (tab) снимите флажок использовать смарт-кавычки и тире (по умолчанию был установлен).


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

  1. в nginx.conf функция sendfile от

  2. uwsgi application / config --отключение-использования sendfile


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

SyntaxError: Unexpected token ILLEGAL

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

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


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

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


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

val.заменить (" " , "Задоров");

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


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

перед:

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

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

после:

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

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