当您使用匿名函数时,我想到的唯一想法是使用辅助函数之类的东西,
- 抛出一个虚拟错误
- 抓住它
- 解析
stacktrace
- 返回一个包含解析信息的对象
如果它用于调试,这可能是合格的,但我会限制在生产环境中使用它,因为我真的不知道是否抛出错误,解析它们。真是个好主意。
哦,作为一个注释,你不应该使用arguments.callee
,因为这是不好的做法,甚至在ECMAScript 5's
严格模式下被禁止
你可以简单地命名你的函数表达式
MDN arguments.callee:
注意:你应该避免使用 arguments.callee() 并且只给每个函数(表达式)一个名字。
警告:ECMAScript 第 5 版禁止在严格模式下使用 arguments.callee()。
这就是我第一次尝试时想出的,我只在最新版本上测试过,IE
Firefox
Chrome
所以你可能需要调整代码
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的例子: