什么是JavaScript语法中有效的左侧表达式?

时间:2010-09-14 14:32:07

标签: javascript grammar ecma262

好的,我们都知道有效的左侧表达式是什么。有点。*

但是,看看the ECMA-Script standard的定义,我很困惑:

LeftHandSideExpression :
    NewExpression
    CallExpression

这只是定义中的错误,还是我在这里弄错了?我的意思是,这实际上并不意味着

new Object = 1; // NewExpression AssignmentOperator PrimaryExpression
function () { return foo; }() = 1;// CallExpression AssignmentOperator PrimaryExpression

应该是有效的赋值表达式吗?


*从我的谦虚理解,这将更有意义:

LeftHandSideExpression :
    Identifier
    MemberExpression [ Expression ]
    MemberExpression . IdentifierName
    CallExpression [ Expression ]
    CallExpression . IdentifierName

2 个答案:

答案 0 :(得分:11)

为了简明扼要地回答您的问题,LeftHandSideExpression作品下的所有内容都是有效的LeftHandSideExpression


我认为你真正提出的问题是:

  

什么是有效的LeftHandSideExpression,也可以分配?

答案是任何解析为Reference的内容,这是规范中明确定义的概念。在你的例子中

new Object = 1;

new Object是有效的LeftHandSideExpression,但不会解析为Reference

(new Object).x = 1;

左侧是MemberExpression . IdentifierName,根据规范,最后一步是:

  

返回类型为Reference ...

的值

如果你认为它有两个独立的属性,那就更有意义了。

  1. 这是一个有效的LeftHandSideExpression吗?
  2. 这是一个有效的参考?
  3. 属性1在句法分析阶段确定,属性2在语义分析阶段确定。查看 8.7.2 PutValue(V,W)了解更多详情。

    以下是规范本身的完整说明:

    8.7参考规格类型

    引用类型用于解释诸如delete,typeof和赋值运算符之类的运算符的行为。例如,期望赋值的左侧操作数生成引用。相反,赋值行为可以完全根据赋值运算符的左侧操作数的句法形式的案例分析来解释,但是对于一个难点:允许函数调用返回引用。纯粹为了宿主对象而承认这种可能性。此规范未定义的内置ECMAScript函数返回引用,并且没有为用户定义的函数提供返回引用的规定。 (不使用句法案例分析的另一个原因是它会冗长而笨拙,影响规范的许多部分。)


    在看了你的建议后,我相信它会抛弃某些有效的表达(注意:我不会宽恕这一点。)

    function OuterObj() {
        this.Name = "Outer";
        this.InnerObj = function() {
            this.Name = "Inner";
        }
    }
    
    var obj; (obj = new new OuterObj().InnerObj).Name = "Assigned";
    

    这是NewExpression很重要的案例

答案 1 :(得分:2)

这是一种替代JavaScript语法,它只匹配有效的LeftHandSideExpressions,即实际可分配的LeftHandSideExpressions。

NewExpression :
    PrimaryExpression
    new NewExpressionQualifier Arguments
    new NewExpressionQualifier

NewExpressionQualifier :
    NewExpressionQualifier Qualifier
    NewExpression

CallExpression :
    NewExpression
    CallExpressionQualifier Arguments

CallExpressionQualifier :
    CallExpression
    CallExpressionQualifier Qualifier

LeftHandSideExpression :
    LeftHandSideExpression Qualifier
    CallExpression Qualifier
    Identifier
    ( LeftHandSideExpression )
    ( Expression , LeftHandSideExpression )

Qualifier :
    . IdentifierName
    [ Expression ]

关联的new或call表达式选择不明确的每个Arguments应与最接近的可能没有相应参数的新表达式相关联。我认为这是JavaScript语法中同时存在NewExpression和MemberExpression非终结符的原因之一。