草庐IT

javascript - 是否可以获取匿名 JavaScript 函数的名称?

coder 2024-07-25 原文

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

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

( Chrome )

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

编辑澄清:

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

最佳答案

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

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

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

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

关于javascript - 是否可以获取匿名 JavaScript 函数的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35871450/

有关javascript - 是否可以获取匿名 JavaScript 函数的名称?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  3. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  4. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  5. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  6. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  7. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  8. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  9. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  10. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

随机推荐