为什么匿名函数在javascript中有自己的语法错误?

Fla*_*ash 8 javascript syntax grammar parsing anonymous-function

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

{prop:'value'}
Run Code Online (Sandbox Code Playgroud)

它解析得很好(在V8和UglifyJS中).类似地,我可以将一个字符串或数字作为源代码放在一起,并且没有报告语法错误.

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

function(){}
Run Code Online (Sandbox Code Playgroud)

我得到Uncaught SyntaxError: Unexpected token (.

当第一个例子中的对象没问题时,为什么会中断?函数不仅仅是javascript中的对象吗?

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

Bol*_*ock 11

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

请注意,ExpressionStatement不能以开括号大括号开头,因为这可能使其与Block不一致.此外,ExpressionStatement不能以function关键字开头,因为这可能使其与FunctionDeclaration不一致.

虽然函数只是对象,但请记住,您可以自己声明函数,而无需在表达式中使用它们的对象.这就是模棱两可的地方.当然,你永远不能声明一个匿名函数(因为你无论如何都无法引用它),但是因为我在规范中找不到区分匿名函数和命名函数声明的任何东西,我怀疑这个适用于两者.

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

(function(){})
Run Code Online (Sandbox Code Playgroud)

  • @Andrew-它会很模糊,因为它可能是一个函数表达式.请注意,在执行任何代码之前处理函数声明,之后在执行代码时处理函数表达式. (2认同)
  • 编译器需要明确的规则来处理一般工作的代码(即在所有情况下无处不在).如果任何一个出现在任何地方,编译器如何知道命名函数表达式和函数声明之间的区别?如果你这样做,你要么摆脱声明或表达.你不想要哪个?:-) (2认同)

xda*_*azz 5

{prop:'value'}不被解析为对象,只被解析为具有标签的块prop.

您需要()将其括起来作为表达式进行解析.

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

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