ログ機能にログを記録するには、現在の関数名を文字列として使用する必要があります。ただし、arguments.callee.name
はルーズモードでのみ機能します。 "use strict"
で関数名を取得するにはどうすればよいですか?
ロギング/デバッグの目的で、ロガーに新しいError
オブジェクトを作成し、その.stack
プロパティを検査できます。
function logIt(message) {
var stack = new Error().stack,
caller = stack.split('\n')[2].trim();
console.log(caller + ":" + message);
}
function a(b) {
b()
}
a(function xyz() {
logIt('hello');
});
関数をコンテキストとしてバインドしてから、this.name
propertyを介してその名前にアクセスできます。
function x(){
console.log(this.name);
}
x.bind(x)();
ここで少し調べた後、良い解決策があります:
function getFnName(fn) {
var f = typeof fn == 'function';
var s = f && ((fn.name && ['', fn.name]) || fn.toString().match(/function ([^\(]+)/));
return (!f && 'not a function') || (s && s[1] || 'anonymous');
}
function test(){
console.log(getFnName(this));
}
test = test.bind(test);
test(); // 'test'