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+'(')
);
}
}