Javascript:对象中的函数根据声明语法自动命名(或不命名) - 为什么?

Sag*_*ual 7 javascript function object

我没有遇到任何问题,也没有尝试解决任何问题.我只是好奇为什么Javascript以这种方式工作.我已经和google一起玩了,但是"js function no name"获得了很多关于如何定义和使用匿名函数的命中(不是我正在寻找的).并且几乎没有任何关于使用导致我混淆的语法声明函数的东西 - 我甚至不知道该语法是什么.

问题:我试图找出当函数在对象内部时,声明语法对函数名称有什么影响的原因.如果我声明一个带有函数的对象,如下所示:

var objectOne = { apple: function() {} }
Run Code Online (Sandbox Code Playgroud)

apple()函数获得一个名称.也就是说,console.log(objectOne.apple.name)显示"苹果".

但是如果我像这样声明一个带有函数的对象:

var objectTwo = {}
objectTwo.banana = function() {}
Run Code Online (Sandbox Code Playgroud)

然后banana()没有得到一个名字.也就是说,console.log(objectTwo.banana.name)什么都不显示.以下内容和类似的排列相同.

var objectThree = { catapult: null }
objectThree.catapult = function() {}
Run Code Online (Sandbox Code Playgroud)

当然,我可以明确地命名这些函数,但同样,我并没有尝试修复任何东西,我只是想知道为什么这两种语法会产生不同的结果.我一直认为它们在功能上是可以互换的.

我注意到这两种形式,不在对象内,自动获取名称:

  function one() {}
  var two = function() {}
Run Code Online (Sandbox Code Playgroud)

为什么object.property = function(){}表格与其他表格的处理方式不同?

Sco*_*cus 0

ECMA 规范中关于如何设置函数名称的信息:

\n\n
\n

SetFunctionName(F,名称,前缀)

\n\n

抽象操作 SetFunctionName 需要一个 Function 参数 F、一个 String 或 Symbol\n 参数名称以及一个可选的 String 参数前缀。此操作通过执行以下步骤向 F 添加名称属性:

\n\n

断言:F 是一个可扩展对象,没有名称自己的属性。

\n\n

断言:类型(名称)是符号或字符串。

\n\n

断言:如果传递了前缀,则类型(前缀)为字符串。

\n\n

如果 Type(name) 是 Symbol,那么

\n\n

令描述为 name\xe2\x80\x99s [[Description]] 值。

\n\n

如果描述未定义,则将 name 设为空字符串。

\n\n

否则,让名称为“[”、描述和“]”的串联。

\n\n

如果传递了前缀,则

\n\n

令 name 为前缀、代码单元 0x0020(空格)和名称的串联。

\n\n

返回 DefinePropertyOrThrow(F, "name", PropertyDescriptor{[[Value]]: name, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true})。

\n\n

断言:结果绝不会突然完成。

\n
\n\n

我的猜测是,第二个示例未能通过设置函数名称的第一个测试(断言:F 是可扩展对象),因此没有设置名称。

\n