【问题标题】:Is it possible to get the name of an anonymous JavaScript function?是否可以获取匿名 JavaScript 函数的名称?
【发布时间】:2016-06-22 15:20:03
【问题描述】:

是否可以获取如下声明的匿名函数的名称?

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 {}

(铬)

这个名字是否可以通过某种方式访问​​?我主要需要它来记录错误,因此解决方案不必是跨浏览器。

编辑澄清:

我从外部代码中获取一个对象,我需要知道它们的类型,因此像使用其他声明方式这样的明显答案不是我要搜索的。

【问题讨论】:

  • 我在错误记录方面遇到了类似的问题。在Error.stack 浏览器中将包含令牌的名称,您可以使用它。
  • 匿名函数不是无名的吗?您想要存储的变量名称。
  • @whd 该问题的接受答案不是我搜索的答案。我在我的问题中澄清了这一点。

标签: javascript function logging


【解决方案1】:

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

也就是说,它可以像这样继续:

var F = function(){};
var x = new F();
var x2 = x;
var x3 = x;
var blah = x3;

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

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

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,虽然在这里没有帮助...

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

事情是这样的: (请注意,这是一个 hack)

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 中尝试过,堆栈跟踪可能在其他地方有所不同。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-29
    • 2014-08-10
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2015-06-15
    相关资源
    最近更新 更多