Javascript 在Chrome控制台中获得类似printed的函数名

Javascript 在Chrome控制台中获得类似printed的函数名,javascript,method-names,Javascript,Method Names,考虑到这一准则: var o = {}; o.f = function(){}; new o.f; Chrome将o.f{}打印到控制台中。你知道这个o.f零件是怎么叫的吗?更重要的是,是否有任何方法可以在不使用控制台的情况下获得此结果?我想从函数本身提取方法的名称,也就是说,不需要任何附加信息 在这种情况下,我已经知道如何获取名称: function f(){} f+'' // "function f(){}" 但在上述情况下,它的行为方式不同 以下内容主要是从中复制的 我想知道关于这个

考虑到这一准则:

var o = {};
o.f = function(){};
new o.f;
Chrome将
o.f{}
打印到控制台中。你知道这个
o.f
零件是怎么叫的吗?更重要的是,是否有任何方法可以在不使用控制台的情况下获得此结果?我想从函数本身提取方法的名称,也就是说,不需要任何附加信息

在这种情况下,我已经知道如何获取名称:

function f(){}
f+'' // "function f(){}"
但在上述情况下,它的行为方式不同


以下内容主要是从中复制的

我想知道关于这个
o.f
模式是否有一个“技术”字,比如“名称空间”、“标识符”或“函数路径”。然后,我想知道是否有一种方法可以从网页中加载的脚本中检索这些信息。以下问题可能有助于您理解我的目标,第一个代码块后面的段落与我的想法非常接近:

也许我应该提到,我最初的目标是在运行时生成文档:/在这种情况下,反射API之类的东西会很有帮助。更准确地说,我正在寻找一种方法,将方法名包含到函数的反编译形式中。看:

function Class(){}
Class.prototype.method = function(){};
Class.prototype.method+'
给出
function(){}
。我想插入方法的名称以获得此结果:
function method(){}


问题是,我没有关于当前序列化哪个函数的任何信息,因为操作是在用户单击链接时发生的。我知道我可以很容易地将名称存储在某个地方,例如,将数据绑定到锚元素,这对我来说很明显,我只是想知道是否有一种方法可以像Chrome一样检索这些数据。

一般来说,这在Javascript或编程中并不常见

但是,
函数
s确实有一个属性名-请参阅。 但是在你的代码中,o.f是一个无名函数

var o = {};
o.f = function(){}; //function (){} creates a nameless function.
您可以在
()

然后


注意:此功能在IE中不受支持,也不是EMCA规范

就所有这些结构的命名而言,这似乎是一个足够简单的问题:

o.f = function(){};
是一个常见语句,由更常见的表达式组成
o.f
只是访问对象属性的两种方法之一,通常称为点表示法。虽然我相信JS,但dot(.)并不是一个真正的操作符,从今以后我将把它称为操作符的成员。
接下来是众所周知的赋值运算符,它将右侧操作数赋值到左侧(对象
o
的成员,称为
f
)。
右侧表达式(需要计算为奇异值)是一个函数定义,它本身不是一个语句,而是用作表达式。鉴于这一事实,我们将函数的这种用法称为函数表达式

在这种情况下,函数没有名称,它是一个匿名函数。在内部,大多数(如果不是所有引擎的话)都会给它起一个名字,但这不是JS应该知道或真正关心的。就JS而言,此函数没有名称,只能通过
o.f
访问。如果像这样调用此函数:
o.f()
,则其上下文将是对象的上下文
o
,有效地使此函数作为一种方法来运行。
因此,基本上您的语句是这样的:“将名为
f
(匿名函数)的
o
的成员分配并创建(如果需要)。”函数本身没有名称

考虑这一点:

var o = {f: function(){console.log('I am a function');}};
var foobar = o.f;
foobar();//logs I am a function
所以说函数名
o.f
f
并不总是适用。其他变量或属性可以引用同一函数。这是因为函数是第一类对象,它们可以从任何对象返回、传递和分配给任何对象

因此,答案是使用以下两种方法之一:

您可以通过添加名称来更改函数表达式,以将其转换为命名函数表达式:

除了旧版本的IE之外,
newName
名称在功能范围之外不可用。这是ECMA规范所要求的。无论如何,现在我们可以检查一下:

var func = function func(){console.log(func);};
//same name:
func();//logs function func(){}
var foobar = func;
foobar();//logs function func(){}
func = 123;//<-- no longer function
foobar();//still function func(){}//func is still accessible
var hidden = (function()
{
    return function named()
    {
        console.log(named);//access name
    };
}());
hidden();//logs function named(){}
console.log(named);//undefined -> not visible outside the function itself

这将对函数进行字符串化(给出
function(){/*body*/}
)并将
函数(
替换为
函数(
)。如果函数已经有了自己的名称,则不会替换该名称。

这将作为函数的
name
属性公开,现在它是标准的一部分(在中搜索
SetFunctionName
)。另请参阅。如果您特别询问匿名函数的变量名自动猜测名称的功能,MDN将调用推断出的函数名


当有人问这个问题时,这个话题的最终讨论是kangax的文章(现在有点过时)。

你需要它做什么?js没有办法(据我所知)@Quentin no可能重复,这是另一个问题。wared基本上想知道如何获取“parent”对象我想你想获取构造函数名称,不是吗?
new o.f
创建了一个
o.f
的新实例。因此没有Chrome秘方:)无论如何,这一切都很有趣。谢谢!
var o = {f: function(){console.log('I am a function');}};
var foobar = o.f;
foobar();//logs I am a function
f.o = function newName(){};
var func = function func(){console.log(func);};
//same name:
func();//logs function func(){}
var foobar = func;
foobar();//logs function func(){}
func = 123;//<-- no longer function
foobar();//still function func(){}//func is still accessible
var hidden = (function()
{
    return function named()
    {
        console.log(named);//access name
    };
}());
hidden();//logs function named(){}
console.log(named);//undefined -> not visible outside the function itself
o = {f: function(){console.log('I am a function');}};
for (var pName in o)
{//probably add o.hasOwnProperty(pName) check to be safe
    if (o[pName] instanceof Function)
    {
        console.log(o.f.toString().replace(
            /^function\s*\(/,
            'function o.'+pName+'(')
        );
    }
}