В Firebug – популярном плагине для Firefox, существует фукнция console.trace(), которая позволяет просмотреть стэк фукнций, т.е. просмотреть последовательность вызова функций до определенной точки. Но если вы его не используете, либо, что более вероятно, вам нужно просмотреть стэк вызова функций на других браузерах, не поддерживающих Firebug, то вам возможно пригодится следующая функция, созданная Эриком Венделином (Eric Wendelin):
function printStackTrace() {
var callstack = [];
var isCallstackPopulated = false;
try {
i.dont.exist+=0; //does not exist - that's the point
} catch(e) {
if (e.stack) { //Firefox
var lines = e.stack.split("\n");
for (var i = 0, len = lines.length; i < len; i++) {
if ( lines[i].match( /^\s*[A-Za-z0-9\-_\$]+\(/ ) ) {
callstack.push(lines[i]);
}
}
//Remove call to printStackTrace()
callstack.shift();
isCallstackPopulated = true;
}
else if (window.opera && e.message) { //Opera
var lines = e.message.split("\n");
for (var i = 0, len = lines.length; i < len; i++) {
if ( lines[i].match( /^\s*[A-Za-z0-9\-_\$]+\(/ ) ) {
var entry = lines[i];
//Append next line also since it has the file info
if (lines[i+1]) {
entry += " at " + lines[i+1];
i++;
}
callstack.push(entry);
}
}
//Remove call to printStackTrace()
callstack.shift();
isCallstackPopulated = true;
}
}
if (!isCallstackPopulated) { //IE and Safari
var currentFunction = arguments.callee.caller;
while (currentFunction) {
var fn = currentFunction.toString();
//If we can't get the function name set to "anonymous"
var fname = fn.substring(fn.indexOf("function") + 8, fn.indexOf("(")) || "anonymous";
callstack.push(fname);
currentFunction = currentFunction.caller;
}
}
output(callstack);
}
function output(arr) {
//Optput however you want
alert(arr.join("\n\n"));
}
Как и console.trace() эта функция показывает стэк вызова функций. Работает она в IE, Firefox, Opera и Safari. Пример использования:
function foo() {
var blah;
bar("blah");
}
function bar(blah) {
var stuff;
thing();
}
function thing() {
if (true) { //your error condition here
printStackTrace();
}
}
foo();
Вероятно более простым способом просмотра стэка было бы использование Firebug Lite, который может работать в IE, Opera и Safari, но все же, ситуации бывают разные.
