ECMAScript 6的function.name属性

时间:2014-12-14 14:16:43

标签: javascript ecmascript-6 ecmascript-harmony

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

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

根据compat tablen应具有值"f"。但是,the mozilla docs表示它应该返回一个空字符串。哪一个是正确的?

2 个答案:

答案 0 :(得分:3)

由于ECMAScript 6目前处于草案状态,以下答案可能会在将来的某个时候过时 话虽如此,引用the spec draft

  

匿名函数没有上下文名称的对象   与此规范相关联的人没有名称   属性,但继承%FunctionPrototype%。

名称属性

ECMAScript 6 Wiki读取

  

如果没有名称可以静态确定,例如在   未分配的匿名函数,然后使用空字符串。

然而,

  

某些功能是匿名的,并且没有作为其中一部分的名称   静态语义。如果功能是直接的   分配给LHS,其名称可由静态确定,然后是LHS   名字被使用。

请注意,维基的声明未在规范草案中引用(并且无法直接找到),但它们是合理的假设。

如果我们假设这些假设为真,那么样本函数调用的结果将是"f",因为匿名函数被分配给LHS。
读取未分配的匿名函数的name属性应该返回一个空字符串。

答案 1 :(得分:1)

在您的示例中,它将返回“f”,以及其他变体:

let f = function(){}
const f = function(){}
var f = function(){}
f = function(){}  // assignment
let f = () => {}
// etc.

ES6规范草案中的相关位是SetFunctionName的全部出现。在您的示例中,请参见第13.2.1.4节中的调用。它仅适用于RHS语法上是匿名函数文字。