javascript - statement - use the function form of use strict
¿Cómo averigua la función de la persona que llama en JavaScript cuando está habilitado el uso estricto? (3)
No me funciona. Esto es lo que finalmente hago, por si acaso ayuda a alguien.
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);
}
¿Es posible ver la llamada / persona que llama de una función cuando está habilitado el use strict
?
''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 ();
Por lo que vale, estoy de acuerdo con los comentarios anteriores. Para cualquier problema que esté tratando de resolver, generalmente hay mejores soluciones.
Sin embargo, solo con fines ilustrativos, aquí hay una solución ( muy fea ):
''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
Solo he probado esto en Chrome, Firefox e IE11, por lo que su millaje puede variar.
Tenga en cuenta que esto no debe utilizarse con fines productivos. Esta es una solución fea, que puede ser útil para la depuración, pero si necesita algo del interlocutor, páselo como argumento o guárdelo en una variable accesible.
La versión corta de la respuesta @pswg (sin lanzar un error, solo instanciar una):
let re = /([^(]+)@|at ([^(]+) /(/g;
let aRegexResult = re.exec(new Error().stack);
sCallerName = aRegexResult[1] || aRegexResult[2];
Fragmento completo:
''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