Почему консоль Google Chrome выдает «SyntaxError: неожиданный токен}» при вводе ( - PullRequest
8 голосов
/ 09 апреля 2011

В консоли Google Chrome, когда мы вводим

(

и вводим, Chrome говорит "SyntaxError: неожиданный токен}" Почему?Ввод просто "(", включая "}".

Мы получаем ту же ошибку, когда вводим

console.log(

Там нет "}" !!!

Следующим токеном должен быть список аргументов или ")", поэтому сообщение об ошибке должно быть "Список ожидаемых аргументов" или "Незакрытый (" или что-то в этом роде.

И я хочу знать, является ли консольный ввод анализируемым как StatementList(opt) (определено вECMA-262)

1 Ответ

21 голосов
/ 09 апреля 2011

Редактировать: Я нашел точный код, который оценивается. Код находится в "src / third_party / WebKit / Source / WebCore / inspector / InjectedScriptSource.js".

Перед тем, как консоль Chrome оценивает ваш код, она помещает его в блок with, чтобы вывести функции командной строки в область видимости. То, что вы вводите, на самом деле оценивается внутри фигурных скобок. Неожиданный токен "}" автоматически вводится Chrome.

Код, который Chrome передает eval:

with ((window && window.console && window.console._commandLineAPI) || {}) {
    <your code here>
};

Поскольку это простая текстовая подстановка, работает следующий пример, и в результате получается объект, который можно развернуть, чтобы увидеть свойство answer:

} 0, { answer: 42

Что (переформатировано) эквивалентно:

with ((window && window.console && window.console._commandLineAPI) || {}) {
}
0, { answer: 42 };

} в начале закрывает блок with. Часть 0, необходима для принудительного синтаксического анализа литерала объекта как выражения, а не другого блока. Затем { answer: 42 является началом литерала объекта, который закрывается вставленным токеном }.

Для большего удовольствия, вот некоторые другие входные данные, которые работают (и их результаты):

> }{ // an empty block, so no value
  undefined

> }!{ // !{} === false
  false

> }!!{ // !!{} === true
  true

> } +{ valueOf: function() { return 123; }
  123
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...