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(){}表格与其他表格的处理方式不同?
ECMA 规范中关于如何设置函数名称的信息:
\n\n\n\n\nSetFunctionName(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
我的猜测是,第二个示例未能通过设置函数名称的第一个测试(断言:F 是可扩展对象),因此没有设置名称。
\n