web-dev-qa-db-fra.com

Comment trouvez-vous la fonction appelant en JavaScript lorsque l'utilisation de strict est activée?

Est-il possible de voir l'appelé/l'appelant d'une fonction lorsque use strict est activé?

'use strict';

function jamie (){
    console.info(arguments.callee.caller.name);
    //this will output the below error
    //uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
};

function jiminyCricket (){
   jamie();
}

jiminyCricket ();

30
Jamie Hutber

Pour ce que cela vaut, je suis d'accord avec les commentaires ci-dessus. Quel que soit le problème que vous essayez de résoudre, il existe généralement de meilleures solutions.

Cependant, à titre d’illustration, voici une solution ( très laide ):

'use strict'

function jamie (){
    var callerName;
    try { throw new Error(); }
    catch (e) { 
        var re = /(\w+)@|at (\w+) \(/g, st = e.stack, m;
        re.exec(st), m = re.exec(st);
        callerName = m[1] || m[2];
    }
    console.log(callerName);
};

function jiminyCricket (){
   jamie();
}

jiminyCricket(); // jiminyCricket

Je n'ai testé cela que dans Chrome, Firefox et IE11. Votre kilométrage peut donc varier.

35
p.s.w.g

S'il vous plaît noter que cela ne devrait pas être utilisé à des fins productives. C'est une solution laide, qui peut être utile pour le débogage, mais si vous avez besoin de quelque chose de l'appelant, transmettez-le en tant qu'argument ou enregistrez-le dans une variable accessible.  

La version abrégée de la réponse @ p.s.w.g (sans générer d'erreur, mais simplement en instancier une):

    let re = /([^(]+)@|at ([^(]+) \(/g;
    let aRegexResult = re.exec(new Error().stack);
    sCallerName = aRegexResult[1] || aRegexResult[2];

Extrait complet:

'use strict'

function jamie (){
    var sCallerName;
    {
        let re = /([^(]+)@|at ([^(]+) \(/g;
        let aRegexResult = re.exec(new Error().stack);
        sCallerName = aRegexResult[1] || aRegexResult[2];
    }
    console.log(sCallerName);
};

function jiminyCricket(){
   jamie();
};

jiminyCricket(); // jiminyCricket

24
inetphantom

Ca ne marche pas pour moi. Voici ce que je fais enfin, au cas où cela aiderait quelqu'un

function callerName() {
  try {
    throw new Error();
  }
  catch (e) {
    try {
      return e.stack.split('at ')[3].split(' ')[0];
    } catch (e) {
      return '';
    }
  }

}
function currentFunction(){
  let whoCallMe = callerName();
  console.log(whoCallMe);
}
5
Benamar

Vous pouvez obtenir une trace de pile en utilisant:

console.trace()

mais ce n'est probablement pas utile si vous devez faire quelque chose avec l'appelant.

Voir https://developer.mozilla.org/en-US/docs/Web/API/Console/trace

0
Larry