rápida y sucia en los navegadores basados en Gecko:
new Error().stack
También puede arrastre manualmente algo de la pila utilizando Function.prototype.caller:
var thisFunction = arguments.callee;
var caller = thisFunction.caller;
var callerCaller = caller.caller;
// ...and eventually, assuming no recursion:
var bottomCaller = ...;
assert(bottomCaller.caller === null);
Uno (posiblemente grande) salvedad de que el truco .caller es que no maneja la recursividad - .caller
se ve desde la parte superior de la pila downwar d para encontrar la primera instancia de la función en la pila y luego devuelve su llamador inmediato, por lo que sin tener cuidado puede bucle buscar infinitamente llamadores.
Otra advertencia a caller
es que, en el futuro, si alguna de su código utiliza el modo estricto de ECMAScript 5, la propiedad caller
de estrictas funciones del modo (o de funciones que a su vez han sido llamados a estrictas funciones del modo) es una so- llamada "píldora venenosa" que arroja un TypeError
cuando se accede. La propiedad caller
de las funciones "enlazadas" (aquellas creadas por el método Function.prototype.bind
de ES5) también es una píldora venenosa. Estas restricciones rompen el algoritmo genérico de andar de pila, aunque uno podría imaginar formas específicas de uso para evitar esto (funciones de anotación de entrada y salida, tal vez).
Tenga en cuenta que caminar sobre la pila como este no es una gran idea en el código de producción (como un truco rápido para la depuración está bien, aunque); en este momento subir la pila como en el último ejemplo es algo costoso en el motor JS de Mozilla, y probablemente te saque del código de la máquina y vuelva al código interpretado. Además, el stack-walk es O (n), lo que puede importar si tiende a tener acumulaciones complejas y profundas.
Es esto para la depuración o la producción? No estoy seguro de que exista una forma estándar de hacerlo en todos los navegadores, pero podría haber algunas características útiles específicas para algunos navegadores ... –
Esto solo sería para eliminar fallas. – rosscj2533