赋值表达式中 name 属性的定义

IT技术 javascript
2021-03-09 08:51:08

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属性的值即使属性名称是括号内的表达式,这也应该没有问题,因为在对象初始值设定项中使用计算属性名称也不会阻止定义匿名函数名称属性。

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

1个回答

第一个片段在赋值运算符下描述

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

一世。让 hasNameProperty 为 HasOwnProperty(rval, "name")。

ii. ReturnIfAbrupt(hasNameProperty)。

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

当您分配给 MemberExpression 时,如在您的最后一个代码段中一样,IsIdentifierRef(LeftHandSideExpression)为 false 并且不会发生任何转换。

如果您搜索标准,IsAnonymousFunctionDefinition您会发现使用此逻辑的其他几种情况(对象初始值设定项、解构赋值)。

IsIdentifierRef被定义了两次(此处此处),并且两个定义都归结为“如果表达式是 IdentifierReference 则返回 true 否则返回 false”,其中IdentifierReference是 an Identifier(该yield内容是为了与非严格代码向后兼容)。

你好乔治,谢谢你的回答。我已经找到了您发布的算法步骤,并且IsAnonymousFunctionDefinition(AssignmentExpression)在这种情况下显然应该返回 true,但我很难理解为什么IsIdentifierRef即使可以检索标识符也返回 false。
2021-05-06 08:51:08
我想,我终于明白了。:-) 只是它似乎不会导致一致的行为,因此我不确定,我可能不会忽略一些适用于这种情况的隐藏规则所以再次感谢你和贝尔吉把事情说清楚!
2021-05-18 08:51:08