web-dev-qa-db-fra.com

Obtenir le nom de la fonction en cours en mode strict

J'ai besoin du nom de la fonction actuelle sous forme de chaîne pour me connecter à notre service de journalisation. Mais arguments.callee.name ne fonctionne qu'en mode lâche. Comment obtenir le nom de la fonction sous "use strict"?

15
exebook

À des fins de journalisation/débogage, vous pouvez créer un nouvel objet Error dans le consignateur et inspecter sa propriété .stack, par exemple.

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');
});

30
georg

Vous pouvez lier une fonction en tant que contexte puis vous pouvez accéder à son nom via this.namepropriété:

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

Après quelques recherches, voici une bonne solution: 

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'

Source: https://Gist.github.com/dfkaye/6384439

0
ismnoiet