Javascript 赋值表达式中名称属性的定义

Javascript 赋值表达式中名称属性的定义,javascript,Javascript,自ECMAScript 6以来,大多数函数对象都定义了name属性 现在,如果一个匿名函数表达式被分配给一个变量,或者是对象初始值设定项中属性定义的一部分,那么变量的标识符或属性的名称将是函数对象的name属性的值 const a = function () {}; console.log(a.name); // a const object = { b : function () {} }; console.log(object.b.name); // b 我在理解规范中关于这种行为的

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

现在,如果一个匿名函数表达式被分配给一个变量,或者是对象初始值设定项中属性定义的一部分,那么变量的标识符或属性的名称将是函数对象的name属性的值

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属性


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

第一个片段在下面描述:

e。如果LeftHandSideExpression的IsAnonymousFunctionDefinition(AssignmentExpression)和IsIdentifierRef均为true,则

一,。让hasNameProperty成为HasOwnProperty(rval,“name”)

二,。ReturnIfAbrupt(hasNameProperty)

iii.如果hasNameProperty为false,则执行SetFunctionName(rval,getReferenceName(lref))

当您分配给MemberExpression时,就像在上一个代码片段中一样,
IsIdentifierRef(LeftHandSideExpression)
为false,不会发生转换

如果您在标准中搜索
IsAnonymousFunctionDefinition
,您将发现使用此逻辑的其他几种情况(对象初始化、解构赋值)


IsIdentifierRef
定义了两次(和),这两个定义都归结为“如果表达式是IdentifierReference,则返回true,否则返回false”,其中是一个
标识符
yield
内容是为了与非严格代码向后兼容)。

您好,georg,谢谢您的回答。我已经找到了您发布的算法步骤,很明显,
IsAnonymousFunctionDefinition(AssignmentExpression)
在这种情况下应该返回true,但我很难理解,为什么
IsIdentifierRef
返回false,即使可以检索到标识符。我想,我终于得到了它。:-)只是它似乎没有导致一致的行为,因此我不确定,我不可能忽略一些适用于这种情况的隐藏规则。所以再次感谢你和Bergi让事情变得清楚!是的,这是规范中一个奇怪的部分,你读对了。你好,伯吉。感谢您的链接(以及链接中的链接)。现在我明白了,我没有误解
IsIdentifierRef
。我只是不确定这一点,并寻求一些确认,因为由此产生的行为对我来说似乎完全不一致,正如你在本次讨论中提到的那样。不幸的是,ES 2017似乎也没有改变任何事情-(