匿名函数名称未显示

时间:2019-06-11 06:09:48

标签: javascript

当我按照以下方式定义一个函数时,我可以检索该函数的名称而没有参数。

    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);

所以我怀疑在两种情况下都将匿名函数分配给某个变量。但是在第一种情况下,它采用变量名作为函数名。但是在第二种情况下却没有。这种特殊行为的原因是什么?

2 个答案:

答案 0 :(得分:3)

  

变量和方法可以从中推断出匿名函数的名称   其句法位置(ECMAScript 2015中的新功能)。

let f = function() {};
let object = {
  someMethod: function() {}
};

console.log(f.name); // "f"
console.log(object.someMethod.name); // "someMethod"
     

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#Inferred_function_names

请注意亮点:可以从其语法位置推断出一个名称。意思是,如果函数在源代码中以左侧表达式出现,从而使引擎可以推断出名称,则它将这样做。但是,在您的情况下,左侧为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);