¿Es posible ver la persona que llama/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 intente 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(); // jiminyCricketSolo probé esto en Chrome, Firefox e IE11, por lo que su kilometraje puede variar.
Tenga en cuenta que esto no debe usarse en producción. Esta es una solución fea, que puede ser útil para la depuración, pero si necesita algo de la persona que llama, páselo como argumento o guárdelo en una variable accesible.
La versión corta de la respuesta de @pswg (sin arrojar un error, solo instanciando uno):
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(); // jiminyCricketNo me funcionó Esto es lo que finalmente hago, por si a alguien le sirve
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); }