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 ();
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.
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
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);
}
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