是否可以获取声明如下的匿名函数的名称?
var F = function(){};
乍一看,答案是肯定的,但显然浏览器知道并保留了函数名称:
var F = function(){};
var x = new F();
console.log(x.constructor); // function F()
(Firefox)的
var F = function(){};
var x = new F();
console.log(x); // F {}
(铬)
这个名字是否可以访问?我需要它主要用于错误记录,因此解决方案不必是跨浏览器。
编辑以澄清:
我从外部代码中获取了一些我需要知道其类型的对象,因此使用其他声明方式的明显答案并不是我正在搜索的内容。
答案 0 :(得分:2)
在您尝试使用的用例中,可能存在多个具有相同匿名功能的变量。
即它可以继续:
var F = function(){};
var x = new F();
var x2 = x;
var x3 = x;
var blah = x3;
所以,现在我们有多个名字要找。我想到的第一件事是遍历窗口下的所有对象并打印它们的名称,该名称与值具有相同的方法。
所以,你会想到类似的东西:
for each (item in window){
if (myfunc == item){
console.log(/*Somehow print the actual name of the item */)
}
}
但是,它不会那样工作,因为现在item
是另一个变量,看起来没有内置属性给出变量名称。
可能是,看看Variable name as a string in Javascript,虽然它在这里没有帮助,但是......
所以,最后,因为你提到你正在尝试进行错误记录,所以想到使用堆栈跟踪。不知道它是否适用于你的情况,可能仍然有点启发:)
这是怎么回事: (要注意,这是一个黑客攻击)
var myFunction = function(){
var err = new Error();
console.log(err.stack)
}
myFunction();
将输出如下内容:
myFunction@debugger eval code:3:17
@debugger eval code:6:5
@debugger eval code:1:15
然后,将其提升到一个新的水平:
var myFunction = function(){
var err = new Error();
console.log(err.stack.split("@")[0])
/* split the stack-trace string and get the first word before @ */
}
myFunction();
现在,输出将是:
myFunction
其中,确实是持有匿名函数的变量的名称。
注意:此答案的灵感来自问题How can I get a Javascript stack trace when I throw an exception?
仅在Firefox中尝试过此操作,其他地方的堆栈跟踪可能会有所不同。
修改强> 无法注意到您的编辑,这可能需要编辑声明,这会破坏您的用例。 :(