【问题标题】:Definition of name property in assignment expression赋值表达式中名称属性的定义
【发布时间】:2016-07-29 14:36:19
【问题描述】:

ECMAScript 6 以来,大多数函数对象都定义了 name 属性。

现在,如果将匿名函数表达式分配给变量或者是对象初始化器中属性定义的一部分,则变量的标识符或属性的名称将是 name 的值em> 函数对象的属性。

const a = function () {};
console.log(a.name); // a

const object = {
  b : function () {}
};
console.log(object.b.name); // b

我在理解有关此行为的文档语义的规范方面没有问题,但我真的不明白,为什么像以下示例中对左侧成员表达式的赋值不会影响 name函数的属性,好像是这样的。

const object = {};
object.c = function () {};
console.log(object.c.name); //

作为成员表达式的一部分,显然有一个标识符可以(并且应该?)用作name属性的值。即使属性名称是括号内的表达式,这也应该没有问题,因为在对象初始化器中使用计算属性名称也不会阻止定义匿名函数的 name 属性。

如果有人能确认观察到的行为符合规范,那就太好了,无论如何,请简要解释适用于该语法的特定语义。

【问题讨论】:

  • 是的,这是规范中奇怪的部分,您已正确阅读。 esdiscuss.org/topic/…
  • 你好,Bergi。感谢您的链接(和链接中的链接)。现在我发现我没有误解IsIdentifierRef。我只是不确定这一点,并寻求一些确认,因为由此产生的行为对我来说似乎完全不一致,正如您在本次讨论中提到的那样。遗憾的是,ES 2017 似乎也没有改变 this 的任何内容。 :-(

标签: javascript


【解决方案1】:

第一个 sn-p 在assignment operators 下描述:

e。如果 LeftHandSideExpression 的 IsAnonymousFunctionDefinition(AssignmentExpression) 和 IsIdentifierRef 都为真,则

我。让 hasNameProperty 为 HasOwnProperty(rval, "name")。

二。 ReturnIfAbrupt(hasNameProperty)。

三。如果 hasNameProperty 为 false,则执行 SetFunctionName(rval, GetReferencedName(lref))。

当您分配给 MemberExpression 时,就像在上一个 sn-p 中一样,IsIdentifierRef(LeftHandSideExpression) 为 false,并且不会发生转换。

如果您搜索IsAnonymousFunctionDefinition 的标准,您会发现使用此逻辑的其他几个案例(对象初始化器、解构赋值)。

IsIdentifierRef 被定义了两次(herehere),两个定义都归结为“如果表达式是 IdentifierReference,则返回 true,否则返回 false”,其中 IdentifierReferenceIdentifier(@ 987654330@ 的东西是为了向后兼容非严格代码)。

【讨论】:

  • 您好,georg,感谢您的回答。我已经找到了您发布的算法步骤,在这种情况下IsAnonymousFunctionDefinition(AssignmentExpression) 应该返回 true,但我很难理解,为什么 IsIdentifierRef 会返回 false,即使可以检索到标识符。
  • 我想,我终于明白了。 :-) 只是它似乎不会导致一致的行为,因此我不确定我是否可能忽略了一些适用于这种情况的 隐藏规则。因此,再次感谢您和 Bergi 让事情变得清晰!
猜你喜欢
  • 2011-02-20
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2021-12-09
相关资源
最近更新 更多