Я получаю эту ошибку JavaScript на моей консоли:
Uncaught SyntaxError: Неожиданный токен ILLEGAL
Это мой код:
var foo = 'bar';
Это очень просто, как вы можете видеть. Как это может быть причиной синтаксической ошибки?
javascript
syntax-error
illegal-characters
bfavaretto
источник
источник
Ответы:
Ошибка
Когда код анализируется интерпретатором JavaScript, он разбивается на части, называемые токенами. Когда токен нельзя классифицировать на один из четырех основных типов токенов , в большинстве реализаций он помечается как «НЕЗАКОННЫЙ», и эта ошибка выдается.
Та же ошибка возникает, если, например, вы пытаетесь запустить файл js с неконтролируемым
@
символом, неуместной фигурной скобкой, скобкой, «умными кавычками», одинарными кавычками, которые не заключены должным образом (например,this.run('dev1)
) и так далее.Но я не вижу ничего незаконного!
Прямо после точки с запятой в коде есть невидимый символ. Это Unicode символ
U+200B
пробела нулевой ширины (он жеZWSP
HTML-сущность​
). Этот персонаж, как известно, вызываетUnexpected token ILLEGAL
ошибку синтаксиса JavaScript.И откуда это взялось?
Не могу сказать точно, но моя ставка на jsfiddle . Если вы вставите код оттуда, он может содержать один или несколько
U+200B
символов. Кажется, инструмент использует этот символ для управления переносом слов в длинных строках.Также сообщалось, что код, вставленный из инструментов разработчика 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 , в котором говорится, что они должны рассматриваться какIdentifierPart
s, когда «за пределами комментариев, строковых литералов и литералов регулярных выражений». Эти символы могут, например, быть частью имени переменной (иvar x\u200c;
действительно работают).В разделе 7.2 перечислены действительные символы пробела (например, табуляция, пробел, пробел без перерывов и т. Д.) И смутно упоминается, что любой другой «разделитель пробела» в Юникоде (категория «Zs») следует рассматривать как пробел. Я, вероятно, не лучший человек, чтобы обсуждать спецификации в этом отношении, но мне кажется, что это
U+200B
следует рассматривать как пробел в соответствии с этим, когда на самом деле реализации (по крайней мере, Chrome и Firefox) воспринимают их как неожиданные токен (или его часть), вызывающий синтаксическую ошибку.источник
function
ключевого слова, которое было невидимым в Vim, пока я не выделил его, используя метод FAQ «Подсветить все непечатаемые символы». Аааа это было бы так хорошо , если бы был способ копировать только символы в диапазоне 32..127 (но там, наверное , есть приложение для этого :))почему вы ищете эту проблему в своем коде? Даже если это копирование.
Если вы видите, что именно происходит после сохранения файла в синхронизированной папке - вы увидите что-то вроде
*****
в конце файла. Это никак не связано с вашим кодом.Решение.
Если вы используете
nginx
в vagrant box - добавьте в конфигурацию сервера:Если вы используете
apache
в vagrant box - добавьте в конфигурацию сервера:Источник проблемы: ошибка VirtualBox
источник
Это также может произойти, если вы копируете код из другого документа (например, PDF) в консоль и пытаетесь запустить его.
Я пытался запустить пример кода из книги Javascript, которую я читаю, и был удивлен, что она не работает в консоли.
По всей видимости, при копировании из PDF в код вводятся неожиданные, недопустимые и невидимые символы.
источник
У меня была та же проблема на моем Mac, и я обнаружил, что это происходит потому, что Mac заменяет стандартные кавычки фигурными кавычками, которые являются недопустимыми символами JavaScript.
Чтобы это исправить, мне пришлось изменить настройки на моем компьютере Mac. Системные настройки => Клавиатура => Текст (вкладка), снимите флажок, используйте умные кавычки и тире (по умолчанию было отмечено).
источник
Я получил эту ошибку в Chrome, когда у меня была неопределенная строка после строки, на которую указывает ошибка. После закрытия строки ошибка исчезла.
Пример с ошибкой:
Пример без ошибок:
источник
Если вы используете программу установки vgingrant nginx +, то основная проблема - это ошибка Виртуального ящика с файлом отправки, как упоминалось в некоторых ответах. Однако, чтобы решить эту проблему, вы должны отключить sendfile в nginx и uwsgi.
В nginx.conf sendfile отключен
приложение / конфиг uwsgi --disable-sendfile
источник
При запуске OS X файловая система создает скрытые ветки практически всех ваших файлов, если они находятся на жестком диске, который не поддерживает HFS +. Это может иногда (случалось со мной только сейчас) привести к тому, что ваш движок JavaScript пытается запустить data-fork вместо кода, который вы намереваетесь запустить. Когда это произойдет, вы также получите
потому что ветвь данных вашего файла будет содержать символ Unicode U + 200B. Удаление файла ветвления данных заставит ваш скрипт выполнять ваш реальный, намеченный код, вместо двоичной ветки данных вашего кода.
источник
Вот моя причина:
перед:
который
\u
является побегом, я понял это с помощью Codepen проанализирует JS.после:
и ошибка исправлена
источник
У меня была такая же проблема, и это произошло потому, что я нажал клавишу ввода при добавлении кода в текстовую строку.
Поскольку это была длинная строка текста, я хотел увидеть все это без прокрутки в текстовом редакторе, однако нажатие клавиши ввода добавило к строке невидимый символ, что было недопустимо. Я использовал Sublime Text в качестве редактора.
источник
Я изменил все области пространства на & nbsp, просто так, и это работало без проблем.
Надеюсь, это кому-нибудь поможет.
источник
Я собираюсь добавить еще один ответ в кучу. Эта проблема может возникнуть и из-за кодировки. Вы хотите, чтобы кодировка utf8 была в безопасности. Некоторые редакторы по умолчанию используют utf16, что может вызвать проблемы. Один из быстрых способов проверить это, например, в коде VS, просто воссоздать тот же контент, но использовать локальный редактор vscode для создания файла. Надеюсь, это поможет некоторым.
источник