17

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

但是,看看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

4

2 回答 2

14

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


我认为您真正要问的问题是:

什么是有效LeftHandSideExpression且可分配的?

答案是任何可以解析为Reference规范中定义明确的概念的东西。在你的例子中

new Object = 1;

new Object是有效的,LeftHandSideExpression但它不能解析为Reference.

(new Object).x = 1;

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

返回引用类型的值...


如果您将其视为 2 个独立的属性,则更有意义。

  1. 它是有效的 LeftHandSideExpression 吗?
  2. 它是一个有效的参考吗?

属性 1 在句法分析阶段确定,属性 2 在语义分析阶段确定。查看8.7.2 PutValue (V, W)了解更多详细信息。

以下是规范本身的完整解释:

8.7 参考规范类型

Reference 类型用于解释诸如 delete、typeof 和赋值运算符等运算符的行为。例如,赋值的左侧操作数预计会产生引用。相反,赋值的行为可以完全通过对赋值运算符左侧操作数的句法形式的案例分析来解释,但有一个困难:允许函数调用返回引用。这种可能性纯粹是为了宿主对象而被承认的。本规范定义的内置 ECMAScript 函数没有返回引用,也没有规定用户定义的函数返回引用。(不使用句法案例分析的另一个原因是它冗长而笨拙,会影响规范的许多部分。)


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

function OuterObj() {
    this.Name = "Outer";
    this.InnerObj = function() {
        this.Name = "Inner";
    }
}

var obj; (obj = new new OuterObj().InnerObj).Name = "Assigned";

NewExpression这是一个重要的案例

于 2010-09-14T14:46:30.400 回答
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 应与最近的可能 new 表达式相关联,否则将没有相应的 Arguments。我认为这是 JavaScript 语法中同时存在 NewExpression 和 MemberExpression 非终结符的原因之一。

于 2017-09-14T15:18:46.110 回答