为什么Google Chrome控制台在输入时会抛出“SyntaxError:Unexpected token}”(

时间:2011-04-09 04:22:33

标签: javascript google-chrome

在Google Chrome控制台中,当我们输入

(

和Enter,Chrome说“SyntaxError:Unexpected token}”为什么?输入只是“(”,不包括“}”。

我们输入

时会出现同样的错误
console.log(

没有“}”!!!

下一个标记应该是参数列表或“)”,因此错误消息应为“预期参数列表”或“未关闭(”或其他内容。

我想知道,控制台输入解析为StatementList(opt)(在ECMA-262中定义)?

1 个答案:

答案 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