Немає видимої причини для "Неочікуваний маркер МЕЖАЛЬНИЙ"


270

Я отримую цю помилку JavaScript на консолі:

Uncaught SyntaxError: Несподіваний маркер NELEGAL

Це мій код:

var foo = 'bar';​

Це дуже просто, як ви бачите. Як це могло викликати синтаксичну помилку?


9
Для читачів в майбутньому: якщо ви зіткнулися з цією помилкою при використанні Vagrant - ця відповідь також може бути корисний: stackoverflow.com/questions/9479117 / ...
OZ_

У випадку, якщо ви відчуваєте це в WordPress, запускайте сценарії від function.php. У мене був певний шаблон, куди я дзвонив JS безпосередньо з шаблону. Перехід до умовного запитання в wp_head або wp_footer вирішив це.
Alpesh Shah

7
Примітка модератора: Тут я видалив купу відповідей, які насправді не відповідають на запитання. Це не так , я повторюю НЕ , місце , щоб перерахувати всі можливі речі ви можете зробити в JavaScript , що призведе до помилки. Питання має дуже конкретну обставину, яка не передбачає жодного із цих сценаріїв, і всі ці приклади просто не відповідають на питання.
animuson

3
Нічого собі, у поліцейських ТА був день роботи з цим питанням. На щастя, деяка відповідна інформація все ще видно у видалених відповідях.
cdonner

Відповіді:


493

Помилка

Коли код аналізує інтерпретатор 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

Я не міг знайти жодної згадки про цей конкретний символ у специфікації ECMAScript (версії 3 та 5.1 ). Поточна версія згадує подібні символи ( U+200Cта U+200D) у Розділі 7.1 , де сказано, що вони повинні трактуватися як IdentifierParts, коли "поза коментарями, рядковими літералами та літералами регулярного виразу". Наприклад, ці символи можуть бути частиною імені змінної (і var x\u200c;справді працює).

У розділі 7.2 перераховані дійсні символи пробілу (такі як вкладка, пробіл, пробіл без перерви тощо), і неясно згадується, що будь-який інший роздільник пробілу Unicode (категорія "Zs") слід розглядати як пробіл. Я, мабуть, не найкраща людина, яка обговорює характеристики в цьому плані, але мені здається, що U+200Bслід вважати пробіл таким, коли насправді реалізація (принаймні Chrome і Firefox) трактує їх як несподівані маркер (або частина одного), що спричиняє синтаксичну помилку.


codepen.io також відображає цей символ. VIM та VI, також відображає його блокнот ++.
rlemon

Спасибі @rlemon, додав у відповідь приклад CodePen. Хороший сайт, я про нього не знав.
bfavaretto

Натрапив на цю саму проблему, коли копіював / вставляв код для класу testTwo з цього питання SO за допомогою Chromium. Мабуть, аналізатор захлинувся підсвічуванням синтаксису functionключового слова, яке було невидимим у Vim, поки я не виділив його за допомогою методу FAQ "Виділити всі недруковані символи". Ах, було б так приємно, якби був спосіб копіювати символи лише в діапазоні 32..127 (але, мабуть, додаток для цього :))
ack

1
@bfavaretto, лише в фрагменті коду в режимі редагування. Не по суті питання, мав би це згадати. (Випробувано на Chrome 43.0.2357.124 м)
Фернандо

1
Багато текстових редакторів дозволяють перемикати кодування символів у файлі. Це надзвичайно корисно, щоб знайти таких образливих персонажів. Моє рішення полягало в тимчасовому переході з UTF-8 на кодування ANSI, видалення недійсних символів, а потім переключення назад. Я використовував безкоштовний Notepad ++ у Windows. EDIT: Виявляється, я пропустив опцію Notepad ++ для "Відображення всіх символів". Той самий результат, менше клопоту: D
mbargiel

64

чому ви шукаєте цю проблему у своєму коді? Навіть, якщо це копійовано.

Якщо ви бачите, що саме відбувається після збереження файлу в синхронізованій папці - ви побачите щось подібне *****в кінці файлу. Це взагалі не пов’язано з вашим кодом.

Рішення.

Якщо ви користуєтеся nginxбродячим вікном - додайте до конфігурації сервера:

sendfile off;

Якщо ви користуєтеся apacheбродячим вікном - додайте до конфігурації сервера:

EnableSendfile Off;

Джерело проблеми: VirtualBox Bug


6
Ви буквально врятували мені день. Я цілий вечір боровся з Nginx + Vagrant, і це вирішило це.
fradeve

2
Можливо , НЕ очікувати , що це буде правильна відповідь (для мене) , але це було, спасибі так багато.
Шарлотта

2
Власне, вона перестала працювати. Потім знову є декілька шарів, що миготять тут, і я просто розв’язав, що міг.
Шарлотта

Спасибі - я був у бродячому вікні з nginx. Я також бачив цю проблему на подібних налаштуваннях Apache.
Камерон

для apache: EnableSendfile Off
jamlee

7

Це також може статися, якщо ви копіюєте код з іншого документа (наприклад, PDF) на консоль і намагаєтеся запустити його.

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

Мабуть, копіювання з PDF вводить у код деякі несподівані, незаконні та невидимі символи.


5

У мене була така ж проблема і на моєму комп'ютері, і я виявив, що Mac замінює стандартні котирування фігурними цитатами, які є незаконними символами JavaScript.

Щоб виправити це, мені довелося змінити налаштування на моєму mac System Preferences => Keyboard => Text (tab), зніміть прапорець, використовуючи смарт-лапки та тире (за замовчуванням встановлено прапорець).


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>";

2
Мені довелося провести відмінності на ваших двох прикладах, щоб з’ясувати різницю, і як тільки я це зробив, я негайно з’ясував свою проблему.
Бен Гарольд

3

Якщо у вас запущено налаштування nginx + uwsgi, тоді основною проблемою є помилка Virtual box з файлом надсилання, як згадується в деяких відповідях. Однак для її вирішення потрібно вимкнути файл Sendfi як у nginx, так і uwsgi.

  1. У nginx.conf sendfile вимкнено

  2. uwsgi application / config - відключити-відправити файл


2

Під час роботи OS X файлова система створює приховані вилки здебільшого всіх ваших файлів, якщо вони знаходяться на жорсткому диску, який не підтримує HFS +. Це може іноді (трапилося зі мною щойно), що ваш механізм JavaScript намагається запустити вилку даних замість коду, який ви маєте намір запустити. Коли це станеться, ви також отримаєте

SyntaxError: Unexpected token ILLEGAL

тому що вилка даних вашого файлу буде містити символ Unicode U + 200B. Якщо вилучити файл виделки даних, ваш сценарій запустить ваш фактичний, призначений код, а не двійкову форку даних вашого коду.

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


1

Ось моя причина:

перед:

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

що \uє втечею, я зрозумів це, використовуючи аналіз Codepen JS.

після:

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

і помилка виправлена


0

У мене була ця сама проблема, і вона виникла через те, що я натиснув клавішу введення при додаванні коду в текстовий рядок.

Оскільки це був довгий рядок тексту, я хотів побачити все це без прокрутки в моєму текстовому редакторі, проте натискання клавіші Enter додало невидимий символ до рядка, який був незаконним. Я використовував Sublime Text як свій редактор.


0

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

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

Я сподіваюся, що це комусь допоможе.


0

Я збираюся додати ще одну відповідь на купу. Ця проблема може статися і через кодування. Ви хочете, щоб кодування utf8 було захищеним. Деякі редактори за замовчуванням використовують utf16, що може спричинити проблему. Один з швидких способів перевірити це, наприклад, у коді VS, просто відтворити той самий вміст, але використовувати локальний редактор vscode для створення файлу. Сподіваюся, що це допомагає деяким.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.