Я получаю эту ошибку JavaScript на своей консоли:
Uncaught SyntaxError: Неожиданная лексема ILLEGAL
Вот мой код:
var foo = 'bar';
Как видите, все очень просто. Как это может привести к синтаксической ошибке?
Когда код разбирается интерпретатором JavaScript, он разбивается на части, называемые "токенами". Если токен не может быть отнесен к одному из [четырех основных типов токенов][13], то в большинстве реализаций он помечается как "ILLEGAL", и возникает эта ошибка.
Та же ошибка возникает, если, например, вы пытаетесь запустить js-файл с неправомерным символом @
, неправильно поставленной фигурной скобкой, скобкой, "умными кавычками", неправильно заключенными в одинарные кавычки (например, this.run('dev1)
) и так далее.
Множество различных ситуаций могут вызвать эту ошибку. Но если у вас нет очевидной синтаксической ошибки или недопустимого символа, она может быть вызвана невидимым недопустимым символом. Именно об этом и пойдет речь в этом ответе..
Но я не вижу ничего незаконного!
Невидимый символ есть в коде, сразу после точки с запятой. Это символ Unicode
U+200B
Zero-width space (он жеZWSP
, сущность HTML
). Известно, что этот символ вызывает синтаксическую ошибку JavaScriptUnexpected token ILLEGAL
.А откуда он взялся?
Я не могу сказать наверняка, но я ставлю на [jsfiddle][2]. Если вы вставите код оттуда, он с большой вероятностью будет включать один или несколько символов
U+200B
. Похоже, инструмент использует этот символ для управления оберткой слов в длинных строках. ОБНОВЛЕНИЕ 2013-01-07После последнего обновления jsfiddle update, [теперь он показывает символ в виде красной точки][jsfiddle-demo], как это делает codepen. По-видимому, он также больше не вставляет символы
U+200B
самостоятельно, так что эта проблема должна быть менее частой впредь. UPDATE 2015-03-17Vagrant, похоже, тоже иногда вызывает эту проблему, из-за ошибки в 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, где говорится, что они должны рассматриваться какIdentifierPart
, когда "находятся вне комментариев, строковых литералов и литералов регулярных выражений". Эти символы могут, например, быть частью имени переменной (иvar x\u200c;
действительно работает). В разделе 7.2 перечислены допустимые символы белого пространства (такие как табуляция, пробел, пробел без разрыва и т.д.), и туманно упоминается, что любой другой "разделитель пробелов" Unicode (категория "Zs") должен рассматриваться как белый пробел. Я, вероятно, не лучший человек для обсуждения спецификаций в этом отношении, но мне кажется, чтоU+200B
должны считаться белым пробелом в соответствии с этим, в то время как на самом деле реализации (по крайней мере, Chrome и Firefox), похоже, рассматривают их как неожиданный токен (или часть токена), вызывая синтаксическую ошибку.
почему вы ищете эту проблему в своем коде? Даже если это копипаст.
Если вы увидите, что именно происходит после сохранения файла в синхронизированной папке - вы увидите что-то вроде *****
в конце файла. Это вообще не связано с вашим кодом.
Решение.
Если вы используете nginx
в vagrant box - добавьте в конфигурацию сервера:
sendfile off;
Если вы используете apache
в блоке vagrant - добавьте в конфигурацию сервера:
EnableSendfile Off;
Источник проблемы: VirtualBox Bug
Это также может происходить, если вы копируете код из другого документа (например, PDF) в консоль и пытаетесь его запустить.
Я пытался запустить некоторый пример кода из книги по Javascript, которую я читаю, и был удивлен, что он не запускается в консоли.
Очевидно, копирование из PDF вводит в код некоторые неожиданные, незаконные и невидимые символы.
Я получил эту ошибку в 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>";
У меня была такая же проблема на моем Mac и обнаружил, что это потому, что Мак был заменить стандартные цитаты с фигурными кавычками, которые являются незаконными символы JavaScript.
Чтобы это исправить мне пришлось менять настройки на моем Mac Системные настройки=>клавиатура=>текст(вкладка) снимите флажок использовать кавычки-елочки и тире (по умолчанию было проверено).
Если вы используете nginx в + настройка на uwsgi залет, то основная проблема-это виртуальный ошибка окно с отправить файл, как упомянуто в некоторых из ответов. Однако чтобы решить ее, вы должны отключить функция sendfile в nginx и на uwsgi.
В nginx.конф функция sendfile от
заявка на uwsgi / конфиг --отключение-использования sendfile
При запуске ОС Х, файловая система создает скрытый вилы в основном все свои файлы, если они находятся на жестком диске, который не'т с HFS+. Это случается (случалось со мной только сейчас) привести в свой JavaScript-движок пытается выполнить данные-вилки вместо кода Вы собираетесь на нем работать. Когда это происходит, вы также получите
SyntaxError: Unexpected token ILLEGAL
потому что вилка данных вашего файл будет содержать код Юникода U+200В характер. Удаление файла вилка данных позволит сделать ваш скрипт запустить свой фактический, предназначенный код, вместо двоичного автопогрузчика данных кода.
.whatever : эти файлы создаются на Тома, что Дон'т поддерживает файл полной НФС характеристики (например, объемы UFS, окна, общие файлы и т. д.). Когда компьютер Mac файл копируется на такой громкости, данные вилкой хранится в файле's обычный имя и дополнительные НФС информации (ресурсов вилка, тип & создатель кодов и т. д.) хранится в второй файл (в формате appledouble все), с именем, которое начинается с ".&и". (Эти файлы, конечно, незаметно, насколько ОС-Х, но не для других ОС'ы; иногда это может раздражать...)
Вот моя причина:
перед:
var path = "D:\xxx\util.s"
что \U
- это побег, я понял это с помощью сайт CodePen'ы анализ на JS.
после:
var path = "D:\\xxx\\util.s"
и исправлена ошибка
У меня была эта же проблема и это произошло, потому что я нажмите клавишу Enter при добавлении кода в текстовой строке.
Потому что это была длинная цепочка из текста я хотел, чтобы все это увидеть без прокрутки в моем текстовом редакторе, однако нажимая Enter добавлен невидимый символ в строке, что является незаконным. Я использую возвышенное текст в мой редактор.