javascript-获取类似于在Chrome控制台中打印的函数名称
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-获取类似于在Chrome控制台中打印的函数名称,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3374字,纯文字阅读大概需要5分钟。
内容图文
考虑此代码:
var o = {};
o.f = function(){};
new o.f;
Chrome会在控制台中显示{}.您知道这个o.f部分是怎么称呼的吗?更重要的是,没有使用控制台就可以得到此结果吗?我想从函数本身中提取方法的名称,也就是说,无需任何其他信息.
在这种情况下,我已经知道如何获取名称:
function f(){}
f+'' // "function f(){}"
但是在上述情况下,它的行为并不相同.
以下内容主要从comments复制.
我想知道是否有“技术”一词来谈论这种o.f模式,例如说“名称空间”,“标识符”或“功能路径”.然后,我想知道是否有一种方法可以从网页中加载的脚本中检索此信息.以下问题可以帮助您理解我的目标,第一个代码块之后的段落与我的想法非常接近:Does Chrome retain each object’s constructor?.
也许我应该提到我的最初目标是在运行时生成文档:/在这种情况下,像反射API可能会有所帮助.更准确地说,我正在寻找一种方法的名称,该方法的名称应包含在函数的反编译形式中.看:
function Class(){}
Class.prototype.method = function(){};
Class.prototype.method”给出function(){}.我想注入方法的名称以获得以下结果:function method(){}.
问题是我没有关于我当前正在序列化哪个功能的任何信息,因为操作是在用户单击链接时发生的.我知道我可以轻松地将名称存储在某个地方,例如将数据绑定到锚元素,这对我来说很明显,我只是想知道是否有一种方法可以像Chrome一样检索此数据.
解决方法:
好吧,就所有这些结构的命名而言,这似乎是一个简单的问题:
o.f = function(){};
是一个常见的语句,包含更多常见的表达式. o.f只是访问对象属性的两种方法之一,通常称为点符号.尽管我相信JS并不是真正将点(.)视为运算符,但此后我将其称为运算符的成员.
接下来,我们有一个著名的赋值运算符,它将右边的操作数赋给左边(对象o的成员,称为f).
右侧表达式(需要评估为一个奇异值)是一个函数定义,该函数定义代替了单独的语句,而被用作表达式.鉴于这一事实,我们将函数的这种用法称为函数表达式.
在这种情况下,该函数没有名称,它是一个匿名函数.在内部,大多数(如果不是所有引擎)都会给它起一个名字,但这不是JS应该知道或不在乎的.就JS而言,此函数没有名称,只能通过o.f访问.如果这样调用该函数:o.f(),则其上下文将是对象o的上下文,从而有效地使此函数充当方法.
因此,基本上,您的声明应如下所示:“将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并不总是适用.其他变量或属性可以引用相同的函数.这是因为函数是一流的对象,它们可以由任何东西返回,传递给和分配给它们.
因此,答案是使用以下两种方法之一:
您可以通过添加名称来更改函数表达式,以将其转换为命名函数表达式:
f.o = function newName(){};
除了较旧版本的IE之外,newName名称在函数范围之外不可用. ECMA规范see the details here要求这样做.无论如何,现在我们可以检查一下:
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
函数的名称限于其自己的范围.
使用一个正则表达式,它有点hacky,并且不会引用两个引用同一函数对象的变量/属性:
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+'(')
);
}
}
这将对函数进行字符串化(赋予函数(){/ * body * /}),并将函数(替换为函数< propertyName>(.).如果该函数已有自己的名称,则不会替换该名称.
内容总结
以上是互联网集市为您收集整理的javascript-获取类似于在Chrome控制台中打印的函数名称全部内容,希望文章能够帮你解决javascript-获取类似于在Chrome控制台中打印的函数名称所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。