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),如果您倾向于具有复杂的深堆栈,这可能很重要.