为什么匿名函数本身就是javascript中的语法错误

Why is an anonymous function on its own a syntax error in javascript?

本文关键字:javascript 语法 错误 函数 为什么      更新时间:2023-09-26

如果我试图执行一个脚本,该脚本的唯一源行是对象:

{prop:'value'}

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

然而,V8和UglifyJS都抱怨这一点:

function(){}

我得到Uncaught SyntaxError: Unexpected token (

当第一个例子中的对象很好时,为什么会中断?函数不就是javascript中的对象吗?

我意识到在不执行匿名函数的情况下声明它不会有任何作用;这不是问题所在。我想知道为什么它会导致解析错误。

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

请注意,ExpressionStatement不能以大括号开头,因为这可能会使其与不明确。此外,ExpressionStatement不能以function关键字开头,因为这可能会使其与FunctionDeclaration不明确。

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

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

(function(){})

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

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

CCD_ 6将被解析为对象表达式。

CCD_ 7将被解析为函数表达式。