web-dev-qa-db-ja.com

厳密モードで現在の関数名を取得する

ログ機能にログを記録するには、現在の関数名を文字列として使用する必要があります。ただし、arguments.callee.nameはルーズモードでのみ機能します。 "use strict"で関数名を取得するにはどうすればよいですか?

16
exebook

ロギング/デバッグの目的で、ロガーに新しい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');
});
32
georg

関数をコンテキストとしてバインドしてから、this.namepropertyを介してその名前にアクセスできます。

function x(){
  console.log(this.name);
}
x.bind(x)();
3
LJ Wadowski

ここで少し調べた後、良い解決策があります:

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'

ソース: https://Gist.github.com/dfkaye/6384439

0
ismnoiet