在Google Chrome控制台中,当我们输入
时(
和Enter,Chrome说“SyntaxError:Unexpected token}”为什么?输入只是“(”,不包括“}”。
我们输入
时会出现同样的错误console.log(
没有“}”!!!
下一个标记应该是参数列表或“)”,因此错误消息应为“预期参数列表”或“未关闭(”或其他内容。
我想知道,控制台输入解析为StatementList(opt)
(在ECMA-262中定义)?
答案 0 :(得分:21)
编辑:我找到了要评估的确切代码。代码位于“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