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


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

Uncaught SyntaxError: Unexpected token ILLEGAL

Это мой код:

var foo = 'bar';​

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

10 265

10 ответов:

ошибка

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

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

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

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

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

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

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

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

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

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

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

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

решение.

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

sendfile off;

если вы используете apache в поле бродяга-добавить на сервер 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, то основной проблемой является ошибка Virtual box с файлом send, как указано в некоторых ответах. Однако для его решения вам нужно отключить sendfile как в nginx, так и в uwsgi.

  1. в nginx.конф sendfile off

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

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

SyntaxError: Unexpected token ILLEGAL

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

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

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

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

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

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

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

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

перед:

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

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

после:

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

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