匿名関数を使用しているため、頭に浮かぶ唯一のアイデアは、ヘルパー関数のようなものを使用することです。
- ダミーのエラーをスローします
- それをキャッチ
- 解析します
stacktrace
- 解析された情報を含むオブジェクトを返します
デバッグ用の場合、これは適格かもしれませんが、エラーをスローして解析するかどうかがよくわからないため、生産的な環境での使用を控えます。はとても良い考えです。
ああ、メモarguments.callee
として、それは悪い習慣であり、ECMAScript 5's
厳密モードでは禁止されているため、使用しないで
ください。単に関数式に名前を付けることができます
MDN 引数.callee:
注: arguments.callee() の使用を避け、すべての関数 (式) に名前を付けてください。
警告: ECMAScript の第 5 版では、strict モードでの 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の例: