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);
所以我怀疑在这两种情况下,匿名函数都被分配给了某个变量。但在第一种情况下,它将变量的名称作为函数的名称。但在第二种情况下,它没有。这种特殊行为的原因是什么?
解决方案
变量和方法可以从其语法位置推断出匿名函数的名称(ECMAScript 2015 中的新功能)。
let f = function() {}; let object = { someMethod: function() {} }; console.log(f.name); // "f" console.log(object.someMethod.name); // "someMethod"
注意重点:一个名字可以从它的句法位置推断出来。意思是,如果该函数出现在源代码中并带有一个让引擎推断名称的左侧表达式,它就会这样做。但是,在您的情况下,左侧是return
,它不允许推断任何名称。Javascript不会通过从函数返回并在调用者的某个位置分配来跟踪它,因此您的匿名函数保持匿名。
推荐阅读
- docker - packer docker builder 在 docker 镜像中配置 docker
- arrays - 如何从 Bash 中的数组表中检索值
- reactjs - 在 Provider 中是否可以仅发送值数据而不是所有组件内容?
- google-sheets - 如何有一个数据输入表单,将数据添加到列并检查重复项
- html - CSS - 每行三个容器
- angular - 角度是否可以在 CMS 内部工作,并且只能充当我网站 URL 的某个子集的 SPA?
- excel - 多个 Excel 选项卡/工作表到图表(动态)
- sql - 如何更新 jsonb 对象的嵌套数组中的值?
- sql-server - 将数据库的所有已定义权限授予用户
- excel - ListFillRange 的 ActiveX ComboBox 动态范围