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
Run Code Online (Sandbox Code Playgroud)
主要表达式如下
PrimaryExpression :
this
Identifier
Literal
ArrayLiteral
ObjectLiteral
( Expression )
Run Code Online (Sandbox Code Playgroud)
第一个问题是:
( Expression )在PrimaryExpression辩护中是什么意思?
该{prop: 'prop'}是ObjectLiteral。因此{prop: 'prop'}()是CallExpression。我正在尝试用JSFIDDLE检查这个,但我有
[20:16:12.347] SyntaxError: syntax error @ http://fiddle.jshell.net/_display/:21
Run Code Online (Sandbox Code Playgroud)
在第二个问题:为什么这个错误是怎么引起的?我认为这{prop: 'prop'}()是正确的路线,我除外错误将是{prop: 'prop'} is not a function.
UPD:我使用的是 Firefox 25.0.1
PrimaryExpression 定义中的 (Expression) 是什么意思?
这是一个递归定义,用于在语法中嵌套任意事物。
JavaScript 语法允许类似的事情
var o = "Hello" +({stuff:"stuff"});
Run Code Online (Sandbox Code Playgroud)
尽管这在语义上没有多大意义,但我们需要能够将任意表达式表达为语言中表达式的一部分。
语法中的这种递归属性允许任意嵌套。
更简单的语法可能是描述基本数学的语法。我们想要描述一些基本的东西,比如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"
Run Code Online (Sandbox Code Playgroud)
请注意这里如何<factor>允许"(" <expression> ")"in 来允许我们想要的任意嵌套。
{}语法无效:{prop: 'prop'}无效,您正在此处开始一个块语句。
形式上 - 您根本不在左侧表达式中,因此第 11.2 节不适用于此处。
相反,您处于12 语句中:
Syntax
Statement :
Block
VariableStatement
EmptyStatement
ExpressionStatement
IfStatement
IterationStatement
ContinueStatement
BreakStatement
ReturnStatement
WithStatement
LabelledStatement
SwitchStatement
ThrowStatement
TryStatement
DebuggerStatement
Run Code Online (Sandbox Code Playgroud)
当它到达Block这里时 - 它会看到12.1 - 块,然后依次执行以下操作:
Block :
{ StatementListopt }
StatementList :
Statement
StatementList Statement
Semantics
Run Code Online (Sandbox Code Playgroud)
就语法而言 - 我们处于 a StatementListinside a之中Block。
该声明包括prop: prop. 在这里,prop:被解析为LabelledStatement解释错误的。
请参阅我的答案,了解它是如何在板材中实现并包装它的。
| 归档时间: |
|
| 查看次数: |
239 次 |
| 最近记录: |