Esta es una función que funcionará en todos los principales navegadores, aunque no funcionará en el modo estricto ECMAScript 5 porque arguments.callee
y caller
se han eliminado en modo estricto.
function getCallStackSize() {
var count = 0, fn = arguments.callee;
while ((fn = fn.caller)) {
count++;
}
return count;
}
Ejemplo:
function f() { g(); }
function g() { h(); }
function h() { alert(getCallStackSize()); }
f(); // Alerts 3
ACTUALIZA 1 de noviembre de 2,011
En modo estricto ES5, no es simplemente no way to navigate the call stack. La única opción que queda es analizar la cadena devuelta por new Error().stack
, que no es estándar, no es universalmente compatible y obviamente problemática, e incluso esta may not be possible for ever.
Actualización 13 de agosto de 2013
Este método también está limitado por el hecho de que una función que se llama más de una vez en una pila única llamada (por ejemplo, a través de la recursión) tirará getCallStackSize()
en un bucle infinito (como señalado por @Randomblue en los comentarios). A continuación se muestra una versión mejorada de getCallStackSize()
: realiza un seguimiento de las funciones que ha visto antes para evitar entrar en un bucle infinito. Sin embargo, el valor devuelto es el número de objetos de función diferentes en la pila de llamadas antes de encontrar una repetición en lugar del verdadero tamaño de la pila de llamadas completa. Esto es lo mejor que puedes hacer, desafortunadamente.
var arrayContains = Array.prototype.indexOf ?
function(arr, val) {
return arr.indexOf(val) > -1;
} :
function(arr, val) {
for (var i = 0, len = arr.length; i < len; ++i) {
if (arr[i] === val) {
return true;
}
}
return false;
};
function getCallStackSize() {
var count = 0, fn = arguments.callee, functionsSeen = [fn];
while ((fn = fn.caller) && !arrayContains(functionsSeen, fn)) {
functionsSeen.push(fn);
count++;
}
return count;
}
¿[esto] (http://eriwen.com/javascript/js-stack-trace/) ayuda? –
El código que Dave Newton señala arroja una excepción, lo captura como 'e' e inspecciona sus propiedades, basado en el navegador. Para Chrome y Mozilla, usa 'e.stack', para Opera 10+ usa' e.stacktrace' y para otros intentará darle sentido a la propiedad 'e.message'. –
¿La traza de la pila de errores no da solo hasta 10 entradas de pila? http://jsfiddle.net/pimvdb/AuyP7/ – pimvdb