对于简单的javascript调试,我将使用警报来显示变量值等。有没有办法在javascript中获取当前的调用堆栈,以便能够在警报中显示它?
感谢。
答案 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)