Я отримую цю помилку JavaScript на консолі:
Uncaught SyntaxError: Несподіваний маркер NELEGAL
Це мій код:
var foo = 'bar';
Це дуже просто, як ви бачите. Як це могло викликати синтаксичну помилку?
Я отримую цю помилку JavaScript на консолі:
Uncaught SyntaxError: Несподіваний маркер NELEGAL
Це мій код:
var foo = 'bar';
Це дуже просто, як ви бачите. Як це могло викликати синтаксичну помилку?
Відповіді:
Коли код аналізує інтерпретатор JavaScript, він розбивається на частини, що називаються "жетонами". Якщо маркер не може бути класифікований в один з чотирьох основних типів жетонів , у більшості реалізацій він позначається "ILLEGAL", і ця помилка викидається.
Ця ж помилка виникає, якщо, наприклад, ви намагаєтеся запустити js-файл із шахрайським @
символом, неправильно поставленою фігурною дужкою, дужкою, "розумними цитатами", одинарними цитатами, які не укладені належним чином (наприклад this.run('dev1)
) тощо.
Дуже багато різних ситуацій можуть спричинити цю помилку. Але якщо у вас немає явної синтаксичної помилки або незаконного символу, це може бути викликано невидимим незаконним символом. Ось в чому ця відповідь.
У коді є невидимий символ відразу після крапки з комою. Це символ U+200B
простору Unicode нульової ширини (він же ZWSP
, HTML-сутність ​
). Цей символ, як відомо, викликає Unexpected token ILLEGAL
помилку синтаксису JavaScript.
Я не можу сказати точно, але моя ставка на jsfiddle . Якщо звідти вставити код, велика ймовірність включити один або кілька U+200B
символів. Здається, інструмент використовує цей символ для керування переносом слів на довгих рядках.
ОНОВЛЕННЯ 2013-01-07
Після останнього jsfiddle поновлення , він тепер показує характер , як червона точка , як codepen робить. Мабуть , це також не вставляє
U+200B
символів самостійно, тому ця проблема відтепер повинна бути рідше.ОНОВЛЕННЯ 2015-03-17
Здається, що Vagrant іноді викликає цю проблему також через помилку у VirtualBox . Відповідно до цього повідомлення в блозі, це рішення встановити
sendfile off;
у своєму nginx config або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 перераховані дійсні символи пробілу (такі як вкладка, пробіл, пробіл без перерви тощо), і неясно згадується, що будь-який інший роздільник пробілу Unicode (категорія "Zs") слід розглядати як пробіл. Я, мабуть, не найкраща людина, яка обговорює характеристики в цьому плані, але мені здається, що U+200B
слід вважати пробіл таким, коли насправді реалізація (принаймні Chrome і Firefox) трактує їх як несподівані маркер (або частина одного), що спричиняє синтаксичну помилку.
function
ключового слова, яке було невидимим у Vim, поки я не виділив його за допомогою методу FAQ "Виділити всі недруковані символи". Ах, було б так приємно, якби був спосіб копіювати символи лише в діапазоні 32..127 (але, мабуть, додаток для цього :))
чому ви шукаєте цю проблему у своєму коді? Навіть, якщо це копійовано.
Якщо ви бачите, що саме відбувається після збереження файлу в синхронізованій папці - ви побачите щось подібне *****
в кінці файлу. Це взагалі не пов’язано з вашим кодом.
Рішення.
Якщо ви користуєтеся nginx
бродячим вікном - додайте до конфігурації сервера:
sendfile off;
Якщо ви користуєтеся apache
бродячим вікном - додайте до конфігурації сервера:
EnableSendfile Off;
Джерело проблеми: VirtualBox Bug
Це також може статися, якщо ви копіюєте код з іншого документа (наприклад, PDF) на консоль і намагаєтеся запустити його.
Я намагався запустити якийсь приклад коду з книги Javascript, яку я читаю, і був здивований, що він не працює в консолі.
Мабуть, копіювання з PDF вводить у код деякі несподівані, незаконні та невидимі символи.
У мене була така ж проблема і на моєму комп'ютері, і я виявив, що Mac замінює стандартні котирування фігурними цитатами, які є незаконними символами JavaScript.
Щоб виправити це, мені довелося змінити налаштування на моєму mac System Preferences => Keyboard => Text (tab), зніміть прапорець, використовуючи смарт-лапки та тире (за замовчуванням встановлено прапорець).
Цю помилку в 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>";
Якщо у вас запущено налаштування nginx + uwsgi, тоді основною проблемою є помилка Virtual box з файлом надсилання, як згадується в деяких відповідях. Однак для її вирішення потрібно вимкнути файл Sendfi як у nginx, так і uwsgi.
У nginx.conf sendfile вимкнено
uwsgi application / config - відключити-відправити файл
Під час роботи OS X файлова система створює приховані вилки здебільшого всіх ваших файлів, якщо вони знаходяться на жорсткому диску, який не підтримує HFS +. Це може іноді (трапилося зі мною щойно), що ваш механізм JavaScript намагається запустити вилку даних замість коду, який ви маєте намір запустити. Коли це станеться, ви також отримаєте
SyntaxError: Unexpected token ILLEGAL
тому що вилка даних вашого файлу буде містити символ Unicode U + 200B. Якщо вилучити файл виделки даних, ваш сценарій запустить ваш фактичний, призначений код, а не двійкову форку даних вашого коду.
. що завгодно: ці файли створені на томах, які не підтримують повної характеристики файлів HFS (наприклад, томи ufs, файлообмінники Windows тощо). Коли файл Mac копіюється в такий об'єм, його вилка даних зберігається під звичайним іменем файлу, а додаткова інформація HFS (вилка ресурсу, тип & коди творця тощо) зберігається у другому файлі (у форматі AppleDouble), з ім'ям, яке починається з ". ". (Звичайно, ці файли непомітні, що стосується OS-X, але не для інших ОС; це іноді може дратувати ...)
Ось моя причина:
перед:
var path = "D:\xxx\util.s"
що \u
є втечею, я зрозумів це, використовуючи аналіз Codepen JS.
після:
var path = "D:\\xxx\\util.s"
і помилка виправлена
У мене була ця сама проблема, і вона виникла через те, що я натиснув клавішу введення при додаванні коду в текстовий рядок.
Оскільки це був довгий рядок тексту, я хотів побачити все це без прокрутки в моєму текстовому редакторі, проте натискання клавіші Enter додало невидимий символ до рядка, який був незаконним. Я використовував Sublime Text як свій редактор.
Я збираюся додати ще одну відповідь на купу. Ця проблема може статися і через кодування. Ви хочете, щоб кодування utf8 було захищеним. Деякі редактори за замовчуванням використовують utf16, що може спричинити проблему. Один з швидких способів перевірити це, наприклад, у коді VS, просто відтворити той самий вміст, але використовувати локальний редактор vscode для створення файлу. Сподіваюся, що це допомагає деяким.