获取匿名函数的名称

4

如何在此示例中从函数内获取变量名称:

// it should return A
var A = function(){ console.log(this.name); } 

有类似这样的东西吗?

1
目前没有解决这个问题的方法,您能描述一下您想要解决的问题是什么吗? - kirugan
@kirugan,反射。 - Pacerier
4个回答

11

该函数是匿名的,它没有名称。 但是,您可以为其命名:

var A = function a() {};

然后可以通过Function.name访问其名称:

var A = function a() {};
A.name
> 'a'

1
@Adam:是的,也不是。所有浏览器都支持它,但有一些实现上的缺陷,例如:https://dev59.com/QF7Va4cB1Zd3GeqPJWik - Guffa

5

我知道这是一个旧的帖子,但它仍然出现在搜索结果中。所以只是为了参考:

一个解决方案可以简单地使用堆栈跟踪。

var stack = new Error().stack;

使用trim和split函数来获取所需的值。

不行,虽然是个好主意,但是不起作用,你会得到类似这样的东西:...at <anonymous>:2:5。我尝试了一些其他的面向对象的方法,比如将一个方法注入到object.constructor.prototype中,然后从对象本身执行它,或者简单地添加一个方法来返回堆栈到对象本身,但无论哪种方式,执行该方法似乎仍然会输出运行一个无名构造函数的堆栈.. :( - user257319

2
没有,JavaScript中没有这样的东西。该函数是匿名的,因此它没有名称,而你想要的是模棱两可的,因为该函数可以像下面这样轻松地引用任意数量的变量:
var a, b, c, d;
a = b = function(){ console.log(this.name); };
c = b;
d = c;
a = b = 5;
// a and b no longer refer to the function, but c and d both do

你实际上想要达成什么目标?我相信有其他方法可以实现它。


2
在最新版的Chrome和Firefox中,可以按照以下步骤实现。我仅建议在调试目的下使用(例如非生产环境中的javascript跟踪)。
var myNameInChrome = /.*Object\.(.*)\s\(/.exec(new Error().stack)[0];
var myNameInFF = new Error().stack.split("@")[0];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接