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)
{prop:'value'}不被解析为对象,只被解析为具有标签的块prop.
您需要()将其括起来作为表达式进行解析.
({prop: 'value'}) 将被解析为对象表达式.
(function(){}) 将被解析为函数表达式.
| 归档时间: |
|
| 查看次数: |
9493 次 |
| 最近记录: |