理解术语和符号 JavaScript

St.*_*rio 5 javascript

考虑秒。ECMA-262 的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
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

Ben*_*aum 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解释错误的。

请参阅我的答案,了解它是如何在板材中实现并包装它的。