在调试javascript时,有没有办法提醒当前的调用堆栈?

时间:2010-01-13 21:07:25

标签: javascript debugging

对于简单的javascript调试,我将使用警报来显示变量值等。有没有办法在javascript中获取当前的调用堆栈,以便能够在警报中显示它?

感谢。

7 个答案:

答案 0 :(得分:39)

基于Gecko的浏览器中的快速和肮脏:

new Error().stack

您还可以使用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);

.caller技巧的一个(可能很大)警告是它不处理递归 - .caller从堆栈顶部向下看,以找到堆栈中函数的第一个实例然后返回其直接调用者,所以不要小心,你可以循环无限地查找调用者。

caller的另一个警告是,如果您的任何代码使用ECMAScript 5的严格模式,那么严格模式函数的caller属性(或者自己从严格调用的函数)模式函数)是一种所谓的“毒丸”,在访问时抛出TypeError。 “绑定”函数的caller属性(由ES5的Function.prototype.bind方法创建的)也是一个毒丸。这些限制打破了通用的堆栈行走算法,尽管人们可以想象使用特定的方法来解决这个问题(也许是入口和出口注释函数)。

请注意,像这样的堆叠行走在生产代码中并不是一个好主意(作为调试它的快速黑客,这很好);目前在后面的例子中走向堆栈在Mozilla的JS引擎中有点昂贵,它可能会让你退出机器代码并重新进入解释代码。此外,堆栈遍历是O(n 2 ),如果您倾向于具有复杂的深层堆栈,这可能很重要。

答案 1 :(得分:24)

在Firefox + Firebug和WebKit上,您可以使用console.trace()

它不会显示alert(),但会在控制台上打印stacktrace

答案 2 :(得分:6)

如果您使用的是Firefox,请使用Firebug之类的调试器。 Chrome和Opera都有内置调试器。 Internet Explorer有Developers Tools

答案 3 :(得分:3)

调试Javascript的最佳方法是使用Firebug,其中包含完整的Javascript调试器。

如果您在IE中进行调试,则可以使用Visual Web Developer Express(或任何其他版本的Visual Studio)。
如果您正在调试IE8,则可以使用其内置的开发人员工具,其中包括调试器。

可以在Javascript中获取调用堆栈;见here

答案 4 :(得分:3)

你看过萤火虫 - 还有一个断点。如果它只是用于调试,那么这可能就足够了。

此外 - 您可以查看Here

答案 5 :(得分:1)

这将为您提供所有调用堆栈 对我有利。

var y = 'arguments.callee.caller';
    while (eval(y) != undefined) {
        stak += eval(y + '.toString()');
        y = y + '.caller';
    }
    alert(stak);

答案 6 :(得分:0)

对于nodejs调试,在Visual Studio Code中,从v.1.14.2开始,它的View-> Debug(Ctrl + Shift + D)