快速提问:这段代码的正确结果是什么:
let f = function(){};
let n = f.name; //"" or "f"?
根据compat table,n
应具有值"f"
。但是,the mozilla docs表示它应该返回一个空字符串。哪一个是正确的?
答案 0 :(得分:3)
由于ECMAScript 6目前处于草案状态,以下答案可能会在将来的某个时候过时 话虽如此,引用the spec draft:
匿名函数没有上下文名称的对象 与此规范相关联的人没有名称 属性,但继承%FunctionPrototype%。
的名称属性
如果没有名称可以静态确定,例如在 未分配的匿名函数,然后使用空字符串。
然而,
某些功能是匿名的,并且没有作为其中一部分的名称 静态语义。如果功能是直接的 分配给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语法上是匿名函数文字。