AAA Главная
Примеры PHP Примеры JavaScript Примеры Ajax Примеры CSS,HTML

Просмотр стека вызова функций в JavaScript

В 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 
0len lines.lengthleni++) {
                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 
0len lines.lengthleni++) {
                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") + 8fn.indexOf("(")) || "anonymous";
            
callstack.push(fname);
            
currentFunction currentFunction.caller;
        }
    }
    
output(callstack);
}

function 
output(arr) {
    
//Optput however you want
    
alert(arr.join("nn"));
}

Как и 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, но все же, ситуации бывают разные.

Автор: http://www.jstoolbox.com/2008/08/14/kak-prosmotret-stek-vyzova-funkcij-v-javascript/#more-208

.

© Copyright 2008-2016 by KDG