javascript - arguments.callee.toString()和arguments.callee.name不返回函数名称

Geu*_*uis 8 javascript function

我正在尝试获取当前正在运行的函数的名称.根据我的阅读,这应该可以使用:

(arguments.callee.toString()).match(/function\s+(\[^\s\(]+)/)
Run Code Online (Sandbox Code Playgroud)

但是,当我在Firefox和Safari(Mac上的最新版本)中运行它时,不会返回该名称.

console.log(arguments.callee)返回函数的源,但不返回指定的名称.arguments.callee.name返回一个空字符串.

我的示例代码如下:

var testobj = {
    testfunc: function(){
        console.log( (arguments.callee.toString()).match(/function\s+(\[^\s\(]+)/) );
    }
}
testobj.testfunc();
Run Code Online (Sandbox Code Playgroud)

Eri*_*ier 10

你声明了一个匿名函数

function(){
Run Code Online (Sandbox Code Playgroud)

你应该声明它

function testfunc(){
Run Code Online (Sandbox Code Playgroud)

打印名称.

  • 请注意,命名函数表达式(这是你所建议的)在IE中表现得很奇怪.见http://yura.thinkweb2.com/named-function-expressions/ (5认同)

Geo*_*pty 8

典型的arguments.callee hacks在这里不起作用,因为你所做的事情被分配了一个匿名函数作为对象'testfunc'键的值.在这种情况下,黑客攻击甚至变得更糟,但可以这样做,如下所示:

var testobj = {
    testfunc: function(){
      for (var attr in testobj) {
              if (testobj[attr] == arguments.callee.toString()) {
                  alert(attr);
                  break;
                }
            }
    }
}
testobj.testfunc();
Run Code Online (Sandbox Code Playgroud)