我试图用构造函数Function定义一个函数,如下所示,但是为什么函数名返回匿名?
let sayHi = new Function('alert("Hello")');
//this will return anonymous
sayHi.name
答案 0 :(得分:6)
发生这种情况是因为您正在创建匿名函数。
命名函数初始化为:
function sayHi() {
alert('Hello');
};
sayHi.name // sayHi
答案 1 :(得分:2)
...但是为什么函数名返回匿名?
因为这就是Function
构造函数的定义方式。规格涵盖了这一点。 Function
constructor调用抽象操作CreateDynamicFunction,该操作将名称结尾处的名称设置为"anonymous"
:
- 执行SetFunctionName( F ,“匿名”)。
这与没有名称的非动态函数形成对比,后者如今相对较难创建,因为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"
希望这对您有帮助!