Редактировать: Я нашел точный код, который оценивается. Код находится в "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