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

ros*_*533 24 javascript debugging

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

谢谢.

Jef*_*den 40

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

new Error().stack
Run Code Online (Sandbox Code Playgroud)

您还可以使用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);
Run Code Online (Sandbox Code Playgroud)

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

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

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


Ale*_*min 25

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

它不显示alert()stacktrace在控制台上打印.


Iva*_*uev 6

如果你在Firefox中,请使用像Firebug这样的调试器.Chrome和Opera都有内置调试器.还有适用于Internet Explorer的开发人员工具.

  • IMO最简单,最快速的调试方法是使用调试器. (2认同)