ECMAScript 6 的 function.name 属性

3

快速提问:这段代码的正确结果是什么:

let f = function(){};
let n = f.name; //"" or "f"?

根据 兼容性表n 的值应该是 "f"。然而,Mozilla 文档 表示它应该返回一个空字符串。哪一个是正确的?

3
这个函数是匿名的,所以我想不出它为什么要被命名为“f”... - MightyPork
我认为name属性存在是为了帮助我们调试代码。因此,将其分配给变量后将其称为f是有意义的,但我不确定。还有一个问题,就是像这样拥有某些东西:let n2 = n; //那么现在name应该返回什么? - Luis Abreu
2个回答

3
自ECMAScript 6目前处于草案状态,因此下面的答案可能在未来的某个时候过时。
话虽如此,参考规范草案

没有与本规范相关联的上下文名称的匿名函数对象不具有name自有属性,但会继承%FunctionPrototype%的name属性。

ECMAScript 6 Wiki指出:

如果无法静态确定名称,例如未分配的匿名函数,则使用空字符串。

然而,

一些函数是匿名的,并且在其静态语义中没有给出名称。如果将该函数直接分配给LHS并且可以静态确定名称,则使用LHS名称。

请注意,维基百科提出的声明没有在规范草案中引用(也无法直接找到),但它们是合理的假设。
如果我们认为这些假设是正确的,那么您示例函数调用的结果将是“f”,因为匿名函数被分配给了左手边。 读取未分配的匿名函数的名称属性应返回一个空字符串。

我不知道为什么他们在维基上考虑这个问题,如果你想要函数表达式有名称,你可以给它们命名,也许将.name设为可写会更好。当你执行var fn = (function () {return function () {}}());时,它是否仍然是“直接分配给LHS”的?我还能再次引用匿名函数而不让它们获得“名称”吗?:'( - Paul S.
我会说fn.name仍然会返回“fn”,不是吗? - Luis Abreu
1
@PaulS.,在这种情况下,RHS 语法上不是函数文本,因此没有设置名称。草案规范对此非常明确。 - Andreas Rossberg

1
在您的例子以及其他变化中,它将返回"f"。
let f = function(){}
const f = function(){}
var f = function(){}
f = function(){}  // assignment
let f = () => {}
// etc.

ES6规范草案中相关的部分都是SetFunctionName的出现。在你的例子中,可以看到它在第13.2.1.4节中的调用。它仅适用于RHS在语法上是匿名函数文字时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接