【问题标题】:how to get current function name where it is defined as part of an object?如何获取当前函数名称,它被定义为对象的一部分?
【发布时间】:2013-03-07 18:28:57
【问题描述】:

有没有办法获取当前函数名,它被定义为对象的一部分? 我知道有这种方法可以在其独立函数的位置获取函数名称。

函数定义:

function funName(){}

获取函数名:

var myName = arguments.callee.toString();
   myName = myName.substr('function '.length);
   myName = myName.substr(0, myName.indexOf('('));

但是当它定义如下时我怎么能得到它:

myobj.prototype.funcName = function(){}

谢谢。

【问题讨论】:

  • function(){} 是匿名的,所以它没有名字。
  • 这个有什么用?如果您能提供更多关于您想要实现的目标的详细信息,其他人将能够提出更好的解决方案。
  • 但是就像@tracevipin 说的,你在做什么?,这是为了logger/debug 的目的,也许你的目标是不同的东西,可以更容易解决,如果您可以提供更多上下文
  • 嗨,你猜对了,我需要它来记录器。

标签: javascript jquery jquery-ui jquery-mobile jquery-plugins


【解决方案1】:

当您使用匿名函数时,我想到的唯一想法是使用辅助函数之类的东西,

  • 引发虚拟错误
  • 抓住它
  • 解析stacktrace
  • 返回一个包含解析信息的对象

如果它用于调试,这可能是合格的,但我会限制在生产环境中使用它,因为我真的不知道是否抛出错误,解析它们。真是个好主意。

哦,请注意,您不应该使用 arguments.callee,因为这是不好的做法,甚至在 ECMAScript 5's 严格模式下被禁止
你可以简单地命名你的函数表达式

MDN arguments.callee:

注意:你应该避免使用 arguments.callee() 并且只给每个函数(表达式)一个名字。
警告:ECMAScript 第 5 版禁止在严格模式下使用 arguments.callee()。

这就是我第一次尝试的结果我只在最新的IEFirefoxChrome 上测试过,所以你可能需要调整代码

var stackTest = function () {
    console.log(getStack(0).fn); //stackTest
}

function getStack(n) {
    var stacks = [];
    try {
        throw new Error("Test")
    } catch (e) {
        var stack = e.stack.split("\n");
        for (var i = 0, j = stack.length; i < j; i++) {
            var current = stack[i].match(/^(?:\s*at? ?)?(.+?)(?:@| )\(?(.*?):[^\/](\d*):?(\d*)?/)
            if (current == null) {
                continue
            }
            var entry = {
                fn: current[1] || "anonymous",
                file: current[2] || "unknown",
                line: ~~current[3],
                column: ~~current[4],
                time: new Date().getTime()
            }
            if ("getStack" !== entry.fn) stacks.push(entry);
        }
    } finally {
        return "number" === typeof n ? stacks[n] : stacks;
    }
}
stackTest();

这是一个示例输出,使用对象的原型函数

function test() {}
test.prototype.anotherTest = function () {
    console.log(getStack(0).fn);
  //Chrome:      "test.anotherTest"
  //Firefox:     "test.prototype.anotherTest"
  //IE:          "anotherTest"
}
var instance = new test();
instance.anotherTest();

也是JSBin上的一个例子:

【讨论】:

  • 看起来是严格模式下的唯一选择。
【解决方案2】:
for(var k in myobj.prototype){
    console.log(k)

}

【讨论】:

    猜你喜欢
    • 2014-01-15
    • 1970-01-01
    • 2019-09-24
    • 2012-04-25
    • 2011-04-17
    • 2011-06-11
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多