Нет видимых причин для «Неожиданный токен НЕЗАКОННЫЙ»

270

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

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

Это мой код:

var foo = 'bar';​

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

bfavaretto
источник
9
Для будущих читателей: если вы столкнулись с этой ошибкой при использовании Vagrant - этот ответ также может быть полезен: stackoverflow.com/questions/9479117/…
OZ_
В случае, если вы испытываете это в WordPress, поставьте в очередь сценарии из functions.php. У меня был конкретный шаблон, где я вызывал JS прямо из шаблона. Переход к условной очереди в wp_head или wp_footer решил эту проблему.
Alpesh Shah
7
Примечание модератора: я удалил кучу ответов, которые на самом деле не отвечают на вопрос. Это, я повторяю, не место для перечисления всех возможных вещей, которые вы можете сделать в JavaScript, которые приведут к этой ошибке. Вопрос имеет очень специфическое обстоятельство, которое не включает ни один из этих сценариев, и все эти примеры просто не отвечают на вопрос.
animuson
3
Ух ты, полиция ТАК провела полевой день с этим вопросом. К счастью, некоторая соответствующая информация все еще видна в удаленных ответах.
cdonner

Ответы:

493

Ошибка

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

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

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

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

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

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

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

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

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

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

Vagrant иногда также вызывает эту проблему из-за ошибки в 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 перечислены действительные символы пробела (например, табуляция, пробел, пробел без перерывов и т. Д.) И смутно упоминается, что любой другой «разделитель пробела» в Юникоде (категория «Zs») следует рассматривать как пробел. Я, вероятно, не лучший человек, чтобы обсуждать спецификации в этом отношении, но мне кажется, что это U+200Bследует рассматривать как пробел в соответствии с этим, когда на самом деле реализации (по крайней мере, Chrome и Firefox) воспринимают их как неожиданные токен (или его часть), вызывающий синтаксическую ошибку.

bfavaretto
источник
codepen.io также отображается для отображения этого символа. VIM и VI, также Notepad ++ отображает его.
rlemon
Спасибо @rlemon, добавил пример CodePen к ответу. Хороший сайт, я не знал об этом.
bfavaretto
Эта проблема возникла при копировании / вставке кода для класса testTwo из этого вопроса SO с использованием Chromium. По-видимому, синтаксический анализатор захлебнулся подсветкой синтаксиса functionключевого слова, которое было невидимым в Vim, пока я не выделил его, используя метод FAQ «Подсветить все непечатаемые символы». Аааа это было бы так хорошо , если бы был способ копировать только символы в диапазоне 32..127 (но там, наверное , есть приложение для этого :))
извед
1
@bfavaretto, только во фрагменте кода в режиме редактирования. Не в теле вопроса, должен был упомянуть об этом. (Проверено на Chrome 43.0.2357.124 м)
Фернандо Лил
1
Многие текстовые редакторы позволяют переключать кодировку символов файла. Это чрезвычайно полезно для поиска таких персонажей. Мое решение состояло в том, чтобы временно переключиться с UTF-8 на кодировку ANSI, удалить недопустимые символы, а затем переключиться обратно. Я использовал бесплатный Блокнот ++ на Windows. РЕДАКТИРОВАТЬ: Оказывается, я пропустил параметр Notepad ++ для «Отображение всех символов». Тот же результат, меньше хлопот: D
mbargiel
64

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

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

Решение.

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

sendfile off;

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

EnableSendfile Off;

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

Николай Фоминых
источник
6
Вы буквально спасли мой день. Я боролся с Nginx + Vagrant целый вечер, и это решило проблему.
fradeve
2
Возможно , НЕ ожидать , что это будет правильный ответ (для меня) , но это было, спасибо так много.
Шарлотта
2
На самом деле, это перестало работать. Опять же, здесь есть несколько слоев символических ссылок, поэтому я просто отменил все, что мог.
Шарлотта
Спасибо - я был в бродячей коробке с nginx. Я также видел эту проблему на аналогичных установках Apache.
Кэмерон
для apache: EnableSendfile Off
jamlee
7

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

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

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

Кайл Пеннелл
источник
5

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

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

user3360944
источник
5

Я получил эту ошибку в 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>";
Ozzy
источник
2
Мне пришлось провести различие между вашими двумя примерами, чтобы выяснить разницу, и как только я это сделал, я сразу понял свою проблему.
Бен Гарольд
3

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

  1. В nginx.conf sendfile отключен

  2. приложение / конфиг uwsgi --disable-sendfile

msrivas
источник
2

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

SyntaxError: Unexpected token ILLEGAL

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

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

Spcaeyob
источник
1

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

перед:

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

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

после:

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

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

Miao1007
источник
0

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

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

Джордан Дэвис
источник
0

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

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

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

Эрдоган
источник
0

Я собираюсь добавить еще один ответ в кучу. Эта проблема может возникнуть и из-за кодировки. Вы хотите, чтобы кодировка utf8 была в безопасности. Некоторые редакторы по умолчанию используют utf16, что может вызвать проблемы. Один из быстрых способов проверить это, например, в коде VS, просто воссоздать тот же контент, но использовать локальный редактор vscode для создания файла. Надеюсь, это поможет некоторым.

rezeli
источник