是否有可能获得匿名JavaScript函数的名称?

Ofi*_* A. 7 javascript logging function

是否有可能获得声明如下的匿名函数的名称?

var F = function(){};
Run Code Online (Sandbox Code Playgroud)

乍一看,答案是否定的,但显然浏览器知道并保留了函数名称:

var F = function(){};
var x = new F();
console.log(x.constructor);   // function F()
Run Code Online (Sandbox Code Playgroud)

(火狐)

var F = function(){};
var x = new F();
console.log(x);    // F {}
Run Code Online (Sandbox Code Playgroud)

(铬)

这个名字是否可以访问?我需要它主要用于错误记录,因此解决方案不必是跨浏览器.

编辑以澄清:

我从外部代码中获取了一个我需要知道其类型的对象,因此使用其他声明方式的明显答案不是我正在搜索的内容.

1uj*_*n4s 2

在您尝试的用例中,可能有多个变量持有相同的匿名函数。

即,它可以继续这样:

var F = function(){};
var x = new F();
var x2 = x;
var x3 = x;
var blah = x3;
Run Code Online (Sandbox Code Playgroud)

所以,现在我们有不止一个名字需要寻找。我首先想到的是循环遍历 window 下的所有对象并打印它们的名称,该名称与值具有相同的方法。

所以,你会想到这样的事情:

for each (item in window){
   if (myfunc == item){
      console.log(/*Somehow print the actual name of the item */)
   }
}
Run Code Online (Sandbox Code Playgroud)

但是,它不会那样工作,因为现在item是另一个变量,并且看起来没有给出变量名称的内置属性。可能是,看看Variable name as a string in Javascript,但它在这里并没有帮助......

所以,最后,既然您提到您正在尝试进行错误日志记录,那么就考虑使用堆栈跟踪。不知道它是否适用于您的情况,可能仍然有点启发:)

事情是这样的:(要警告的是,这是一个黑客行为)

var myFunction = function(){   
  var err = new Error();   
  console.log(err.stack) 
} 
myFunction();
Run Code Online (Sandbox Code Playgroud)

将输出类似:

myFunction@debugger eval code:3:17
@debugger eval code:6:5
@debugger eval code:1:15
Run Code Online (Sandbox Code Playgroud)

并且,将其提升到一个新的水平:

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();
Run Code Online (Sandbox Code Playgroud)

现在,其输出将是:

myFunction
Run Code Online (Sandbox Code Playgroud)

这确实是保存匿名函数的变量的名称。

注意:这个答案的灵感来自于问题How can I get a Javascript stack track when I throw an exception?

仅在 Firefox 中尝试过此操作,其他地方的堆栈跟踪可能会有所不同。

编辑: 未能注意到您的编辑,这可能需要编辑声明,这会破坏您的用例。:(