自 ECMAScript 6 以来,大多数函数对象都定义了 name 属性。
现在,如果将匿名函数表达式赋给变量或者是对象初始值设定项中属性定义的一部分,则变量的标识符或属性的名称将是名称的值函数对象的属性。
const a = function () {};
console.log(a.name); // a
const object = {
b : function () {}
};
console.log(object.b.name); // b
我没有理解有关此行为的文档语义的规范,但我无法真正看到,为什么对左侧成员表达式的赋值如下例所示不会影响函数的名称属性,似乎就是这种情况。
const object = {};
object.c = function () {};
console.log(object.c.name); //
作为成员表达式的一部分,显然有一个标识符可以(并且应该)用作 name 属性的值。即使属性名称是括号内的表达式,这应该没有问题,因为在对象初始值设定项中使用计算属性名称不会阻止定义匿名函数的 name 属性。 / p>
如果有人能够确认所观察到的行为符合规范并且无论如何都会很好地解释适用于此语法的特定语义,那将会很棒。
答案 0 :(得分:2)
第一个代码段在assignment operators:
下描述即如果LeftHandSideExpression的IsAnonymousFunctionDefinition(AssignmentExpression)和IsIdentifierRef都为true,那么
我。让hasNameProperty为HasOwnProperty(rval," name")。
II。 ReturnIfAbrupt(hasNameProperty)。
III。如果hasNameProperty为false,则执行SetFunctionName(rval,GetReferencedName(lref))。
当您分配到MemberExpression时,与上一个代码段一样,IsIdentifierRef(LeftHandSideExpression)
为false且不会进行转换。
如果您搜索IsAnonymousFunctionDefinition
的标准,您会发现其他一些使用此逻辑的情况(对象初始化器,解构分配)。
IsIdentifierRef
定义了两次(here和here),两个定义都归结为"如果表达式是IdentifierReference,则返回true,否则返回false",其中IdentifierReference
是Identifier
(yield
内容是为了向后兼容非严格代码。)