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

萨甘仪式

我没有问题,没有尝试修复任何问题。我很好奇Java为什么以这种方式工作。我已经在Google上闲逛了,但是“ js函数无名”在如何定义和使用匿名函数(不是我要找的东西)方面获得了很多成功。而且几乎没有关于使用引起语法混乱的语法声明函数的信息,我什至不知道该语法被称为什么。

问题:我试图弄清楚为什么当函数在对象内部时声明语法会对函数名称产生任何影响。如果我声明的对象内部具有如下功能:

var objectOne = { apple: function() {} }

apple()函数获得一个名称。console.log(objectOne.apple.name)显示“苹果”。

但是,如果我声明的对象内部具有如下功能:

var objectTwo = {}
objectTwo.banana = function() {}

然后banana()没有名字。也就是说,console.log(objectTwo.banana.name)什么也不显示。以下内容相同,排列相似。

var objectThree = { catapult: null }
objectThree.catapult = function() {}

当然,我可以显式地命名函数,但是我还是不想修复任何东西,我只是想知道为什么两种语法会产生不同的结果。我一直认为它们在功能上可以互换。

我注意到这两种形式(不是在对象内部)都会自动获取名称:

  function one() {}
  var two = function() {}

为什么将object.property = function(){}表格与其他表格区别对待?

斯科特·马库斯(Scott Marcus)

ECMA规范中了解如何设置函数名称:

SetFunctionName(F,名称,前缀)

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

断言:F是没有名称专有属性的可扩展对象

断言:Type(name)是Symbol或String。

断言:如果传递了前缀,则Type(前缀)为String。

如果Type(name)是Symbol,则

让description为名称的[[Description]]值。

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

否则,让name为“ [”,description和“]”的串联。

如果通过了前缀,那么

令name为前缀,代码单元0x0020(SPACE)和name的串联。

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章