当我按照以下方式定义一个函数时,我可以检索该函数的名称而没有参数。
let func = function(arg1, arg2){
console.log("I am a function");
}
console.log("Function name : " + func.name);
console.log("No of parameters : " + func.length);
但是,如果我使用另一个函数在变量中检索匿名函数,则该函数名称将显示为空字符串。
let func = function(){
return function(arg1, arg2, arg3){
console.log("Nested anonymous function");
};
}
let func1 = func();
console.log("Function name : " + func1.name); // "func1" expected
console.log("No of parameters : " + func1.length);
所以我怀疑在两种情况下都将匿名函数分配给某个变量。但是在第一种情况下,它采用变量名作为函数名。但是在第二种情况下却没有。这种特殊行为的原因是什么?
答案 0 :(得分:3)
变量和方法可以从中推断出匿名函数的名称 其句法位置(ECMAScript 2015中的新功能)。
let f = function() {}; let object = { someMethod: function() {} }; console.log(f.name); // "f" console.log(object.someMethod.name); // "someMethod"
请注意亮点:可以从其语法位置推断出一个名称。意思是,如果函数在源代码中以左侧表达式出现,从而使引擎可以推断出名称,则它将这样做。但是,在您的情况下,左侧为return
,不允许推断任何名称。 Javascript将不通过从函数返回并分配给调用者中的某个位置来跟踪它,因此您的匿名函数将保持匿名状态。
答案 1 :(得分:0)
这是对您的理论进行补充的实验。如果您命名由func
返回的函数,则将func1.name
设置为该名称。我认为可以断定仅在使用function ...() { ... }
语法初始化函数时才设置函数名
let func = function(){
return function func1(arg1, arg2, arg3){
console.log("Nested anonymous function");
};
}
let func1 = func();
console.log("Function name : " + func1.name); // "func1" set
console.log("No of parameters : " + func1.length);