在javascript中使用javascript确定堆栈深度

determine stack depth in javascript using javascript

本文关键字:javascript 堆栈 深度      更新时间:2023-09-26

是否有一种方法可以通过使用javascript本身来确定在javascript中执行的所有函数的堆栈深度?

我想这可能涉及修改Function原型,但我真的不知道。

此外,如果能够在堆栈深度足够高的时候中断,那就太好了。

这样做的原因是我在IE中有一个堆栈溢出错误,显然是不可调试的。我很懒,我不想在我维护的代码中寻找原因。

谢谢你帮助我的懒惰。

ECMAscript在相当长一段时间内支持Function.prototype.caller属性。即使它在ES5严格弃用,IE仍然应该支持它。所以你基本上可以循环遍历所涉及的函数。

function one() {
   two();
}
function two() {
   three();
}
function three() {
    var caller = three.caller;
    console.log('caller was: ', caller.name);
    while( caller = caller.caller ) {
           console.log('caller was: ', caller.name);
    }
}
(function outer() {
    one();
}());

输出:

caller was: two
caller was: one
caller was: _outer

如果你知道在哪个函数中发生了错误,那么你就得到了答案,一直到这个方法最初是如何被调用的。如果你只是在深度之后,你可以计算在caller.caller属性上进行了多少次交互。至少IE8应该支持"debugger"语句,你可以在脚本中调用它来将调试器带到舞台上。

function stackDepth() {
  var c=stackDepth.caller, depth=0;
  while (c) { c = c.caller; depth++; }
  return depth;
}

Chrome似乎认为控制台的堆栈深度已经是3了,所以也许对于每个JavaScript环境,你需要确定一个初始基线深度并从中减去。

stackDepth(); // => 3
(function(){return stackDepth();})(); // => 4