考虑ECMA-262的Sec. 11.2。
Syntax
MemberExpression :
PrimaryExpression
FunctionExpression
MemberExpression [ Expression ]
MemberExpression . IdentifierName
new MemberExpression Arguments
NewExpression :
MemberExpression
new NewExpression
CallExpression :
MemberExpression Arguments
CallExpression Arguments
CallExpression [ Expression ]
CallExpression . IdentifierName
Arguments :
( )
( ArgumentList )
ArgumentList :
AssignmentExpression
ArgumentList , AssignmentExpression
LeftHandSideExpression :
NewExpression
CallExpression
PrimaryExpression :
this
Identifier
Literal
ArrayLiteral
ObjectLiteral
( Expression )
第一个问题是:
( Expression )
在PrimaryExpression
定义中的含义是什么?
{prop: 'prop'}
是ObjectLiteral
。因此{prop: 'prop'}()
是CallExpression
。我试着用JSFIDDLE检查一下,但我有
[20:16:12.347] SyntaxError: syntax error @ http://fiddle.jshell.net/_display/:21
第二个问题:
为什么会出现此错误?我认为{prop: 'prop'}()
是正确的,我不认为错误会有点{prop: 'prop'} is not a function
。
UPD:我正在使用firefox 25.0.1
答案 0 :(得分:2)
第一个问题:
( Expression )
仅表示(
,Expression
,然后是)
。
第二个问题:
{prop: 'prop'}()
被解析为:
// a block
{
// syntax error
prop: 'prop'
}
// syntax error
()
你可以添加parens,然后你会得到预期的错误:
({prop: 'prop'}())
这也有效,因为块在那里无效:
var obj = {prop: 'prop'}
obj()
答案 1 :(得分:1)
什么(表达式)在PrimaryExpression defenition中意味着什么?
这是一个递归定义,用于在语法中嵌套任意内容。
JavaScript语法允许像
这样的东西var o = "Hello" +({stuff:"stuff"});
虽然这在语义上不是很有意义,但我们需要能够将任意表达式表达为语言中表达式的一部分。
语法中的这个递归属性允许任意嵌套。
更简单的语法可能是描述基本数学的语法。我们想要描述像3+5+3/(5+3)
这样的基本内容。
我们希望允许运算符优先级和任意嵌套 - 这里的定义本身是递归的。让我们从维基百科看到这个:
<expression> ::= <term> | <expression> "+" <term>
<term> ::= <factor> | <term> "*" <factor>
<factor> ::= <constant> | <variable> | "(" <expression> ")"
<variable> ::= "x" | "y" | "z"
<constant> ::= <digit> | <digit> <constant>
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
请注意<factor>
如何在其中允许"(" <expression> ")"
以允许我们想要的任意嵌套。
{}
语法无效的原因: {prop: 'prop'}
无效,你在这里开始一个块语句。
正式 - 你根本不在左手边表达,因此第11.2节不适用于此。
而是你在12 - statement:
Syntax
Statement :
Block
VariableStatement
EmptyStatement
ExpressionStatement
IfStatement
IterationStatement
ContinueStatement
BreakStatement
ReturnStatement
WithStatement
LabelledStatement
SwitchStatement
ThrowStatement
TryStatement
DebuggerStatement
当它在此处点击Block
时,它会看到12.1 - Block,而这又会发生:{/ p>
Block :
{ StatementListopt }
StatementList :
Statement
StatementList Statement
Semantics
就语法而言 - 我们位于StatementList
内的Block
内。
该声明包括prop: prop
。在这里,prop:
被解析为LabelledStatement
,解释了错误。
请参阅my answer here,了解它是如何在印版中实现的并将其包裹起来。