当我用new Function定义一个函数时,函数名返回匿名

时间:2018-07-19 07:22:06

标签: javascript

我试图用构造函数Function定义一个函数,如下所示,但是为什么函数名返回匿名?

let sayHi = new Function('alert("Hello")');
//this will return anonymous
sayHi.name

4 个答案:

答案 0 :(得分:6)

发生这种情况是因为您正在创建匿名函数。

命名函数初始化为:

function sayHi() {
  alert('Hello');
};

sayHi.name // sayHi

答案 1 :(得分:2)

  

...但是为什么函数名返回匿名?

因为这就是Function构造函数的定义方式。规格涵盖了这一点。 Function constructor调用抽象操作CreateDynamicFunction,该操作将名称结尾处的名称设置为"anonymous"

  
      
  1. 执行SetFunctionName( F ,“匿名”)。
  2.   

这与没有名称的非动态函数形成对比,后者如今相对较难创建,因为ES2015定义了在大多数情况下,将名称分配给使用匿名(!)函数表达式创建的函数。

例外是分配给预先存在的对象上的属性:

const o = {};
o.foo = function() { };
console.log(o.foo.name); // ""


仅出于完整性考虑,以下一些函数既不使用""也不使用"anonymous"作为其name

function foo() {
}
console.log(foo.name);

const bar = function() { };
console.log(bar.name);

const baz = () => { };
console.log(baz.name);

(是的,后两个名称被指定为指定行为;有关详细信息,请参见this answer。)

答案 2 :(得分:0)

函数构造函数不接受名称,因此它始终是docs中指定的匿名名称: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name

答案 3 :(得分:-1)

使用语法new Function(...)或仅Function(...)创建的函数将创建Function对象,其名称为“匿名”。

(new Function).name; // "anonymous"

希望这对您有帮助!