8

如果我尝试执行其唯一源代码行是对象的脚本:

{prop:'value'}

它解析得很好(在 V8 和 UglifyJS 中)。同样,我可以将字符串或数字作为源代码单独放置,并且不会报告语法错误。

然而,V8 和 UglifyJS 都在抱怨这个问题:

function(){}

我明白了Uncaught SyntaxError: Unexpected token (

当第一个示例中的对象正常时,为什么会中断?函数不只是javascript中的对象吗?

我意识到声明一个匿名函数而不执行它不会做任何事情;那不是问题。我想知道为什么它会导致解析错误。

4

2 回答 2

11

来自 ECMAScript 规范,关于表达式语句的第 12.4 节:

请注意,ExpressionStatement不能以左大括号开头,因为这可能会使它与Block模棱两可。此外,ExpressionStatement 不能以function关键字开头,因为这可能会使它与FunctionDeclaration模棱两可。

尽管函数只是对象,但请记住,您可以自己声明函数,而无需在表达式中真正使用它们的对象。这就是歧义所在。当然,您永远不能单独声明匿名函数(因为无论如何您都无法引用它),但是由于我在规范中找不到任何区分匿名函数和命名函数声明的内容,我怀疑这一点适用于两者。

为了解决歧义,您需要将其括在括号中,因此它将始终被视为表达式:

(function(){})
于 2012-09-08T09:56:15.120 回答
5

{prop:'value'}不被解析为对象,只是被解析为一个带有标签的块prop

您需要()将其括起来以解析为表达式。

({prop: 'value'})将被解析为对象表达式。

(function(){})将被解析为函数表达式。

于 2012-09-08T09:56:29.617 回答