繁体   English   中英

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

[英]Is it possible to get the name of an anonymous JavaScript function?

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

var F = function(){};

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

var F = function(){};
var x = new F();
console.log(x.constructor);   // function F()

(火狐)

var F = function(){};
var x = new F();
console.log(x);    // F {}

(铬)

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

编辑以澄清:

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

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

即,它可以继续下去:

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是另一个变量,看起来没有提供变量名称的内置属性。 可能是,看一下变量名称作为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

其中,确实是持有匿名函数的变量的名称。

注意:这个答案的灵感来自于如何在抛出异常时获取Javascript堆栈跟踪的问题

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM