理解术语和符号JavaScript

时间:2013-12-19 19:02:28

标签: javascript

考虑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如下

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

2 个答案:

答案 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,了解它是如何在印版中实现的并将其包裹起来。