Я получаю эту ошибку JavaScript на моей консоли:
Uncaught SyntaxError: Неожиданный токен ILLEGAL
Это мой код:
var foo = 'bar';
Это очень просто, как вы можете видеть. Как это может быть причиной синтаксической ошибки?
Я получаю эту ошибку JavaScript на моей консоли:
Uncaught SyntaxError: Неожиданный токен ILLEGAL
Это мой код:
var foo = 'bar';
Это очень просто, как вы можете видеть. Как это может быть причиной синтаксической ошибки?
Ответы:
Когда код анализируется интерпретатором JavaScript, он разбивается на части, называемые токенами. Когда токен нельзя классифицировать на один из четырех основных типов токенов , в большинстве реализаций он помечается как «НЕЗАКОННЫЙ», и эта ошибка выдается.
Та же ошибка возникает, если, например, вы пытаетесь запустить файл js с неконтролируемым @
символом, неуместной фигурной скобкой, скобкой, «умными кавычками», одинарными кавычками, которые не заключены должным образом (например, this.run('dev1)
) и так далее.
Множество разных ситуаций могут вызвать эту ошибку. Но если у вас нет явной синтаксической ошибки или недопустимого символа, это может быть вызвано невидимым недопустимым символом. Вот о чем этот ответ.
Прямо после точки с запятой в коде есть невидимый символ. Это Unicode символ U+200B
пробела нулевой ширины (он же ZWSP
HTML-сущность ​
). Этот персонаж, как известно, вызывает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 (версии 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 - добавьте в конфигурацию сервера:
sendfile off;
Если вы используете apache
в vagrant box - добавьте в конфигурацию сервера:
EnableSendfile Off;
Источник проблемы: ошибка VirtualBox
Это также может произойти, если вы копируете код из другого документа (например, PDF) в консоль и пытаетесь запустить его.
Я пытался запустить пример кода из книги Javascript, которую я читаю, и был удивлен, что она не работает в консоли.
По всей видимости, при копировании из PDF в код вводятся неожиданные, недопустимые и невидимые символы.
У меня была та же проблема на моем Mac, и я обнаружил, что это происходит потому, что Mac заменяет стандартные кавычки фигурными кавычками, которые являются недопустимыми символами JavaScript.
Чтобы это исправить, мне пришлось изменить настройки на моем компьютере Mac. Системные настройки => Клавиатура => Текст (вкладка), снимите флажок, используйте умные кавычки и тире (по умолчанию было отмечено).
Я получил эту ошибку в 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>";
Если вы используете программу установки vgingrant nginx +, то основная проблема - это ошибка Виртуального ящика с файлом отправки, как упоминалось в некоторых ответах. Однако, чтобы решить эту проблему, вы должны отключить sendfile в nginx и uwsgi.
В nginx.conf sendfile отключен
приложение / конфиг uwsgi --disable-sendfile
При запуске OS X файловая система создает скрытые ветки практически всех ваших файлов, если они находятся на жестком диске, который не поддерживает HFS +. Это может иногда (случалось со мной только сейчас) привести к тому, что ваш движок JavaScript пытается запустить data-fork вместо кода, который вы намереваетесь запустить. Когда это произойдет, вы также получите
SyntaxError: Unexpected token ILLEGAL
потому что ветвь данных вашего файла будет содержать символ Unicode U + 200B. Удаление файла ветвления данных заставит ваш скрипт выполнять ваш реальный, намеченный код, вместо двоичной ветки данных вашего кода.
, все: эти файлы создаются на томах, которые изначально не поддерживают полные характеристики файлов HFS (например, тома ufs, общие файловые ресурсы Windows и т. д.). Когда файл Mac копируется на такой том, его ветвь данных сохраняется под обычным именем файла, а дополнительная информация HFS (ветвь ресурса, коды типов и создателей и т. Д.) Сохраняется во втором файле (в формате AppleDouble), с именем, начинающимся с ". " (Эти файлы, конечно, невидимы для OS-X, но не для других ОС; иногда это может раздражать ...)
У меня была такая же проблема, и это произошло потому, что я нажал клавишу ввода при добавлении кода в текстовую строку.
Поскольку это была длинная строка текста, я хотел увидеть все это без прокрутки в текстовом редакторе, однако нажатие клавиши ввода добавило к строке невидимый символ, что было недопустимо. Я использовал Sublime Text в качестве редактора.
Я собираюсь добавить еще один ответ в кучу. Эта проблема может возникнуть и из-за кодировки. Вы хотите, чтобы кодировка utf8 была в безопасности. Некоторые редакторы по умолчанию используют utf16, что может вызвать проблемы. Один из быстрых способов проверить это, например, в коде VS, просто воссоздать тот же контент, но использовать локальный редактор vscode для создания файла. Надеюсь, это поможет некоторым.