有没有办法在javascript中动态查看调用堆栈?

有没有办法在javascript中动态查看调用堆栈?,javascript,html,Javascript,Html,这是一个一般性问题,但问题代码如下: 有一个抛出到-handles例外的错误例程: MyObj.prototype.err = function( msg ) { ... throw(msg); } 所以要扔, if( mybad ) this.err( 'my message' ); 希望err根据函数是否在调用堆栈中而表现不同 例如,可能是 funcA() -> func2() -> func3() -> err() 对 funcB() -> func3() -

这是一个一般性问题,但问题代码如下:

有一个抛出到-handles例外的错误例程:

MyObj.prototype.err = function( msg ) { ... throw(msg); }
所以要扔,

if( mybad ) this.err( 'my message' );
希望err根据函数是否在调用堆栈中而表现不同

例如,可能是

funcA() -> func2() -> func3() -> err()

funcB() -> func3() -> err()
如果funcA在上游,则希望提醒用户并停止;而如果funcB,则希望将消息写入控制台并继续


认识到解决问题的其他方法,但是如果在Chrome中创建和维护可以从环境中推断出的状态空间,那么我就不走运了

var err = function( msg ) {
  // ... 
  var error = new Error();
  var stack = error.stack;
  // Do some string manipulation with stack
  // mayThrow = 'funcB is in stack'
  if (mayThrow) {
    throw(msg); 
  }
};
我可以指出,我认为这是一个非常糟糕的做法。我认为您应该捕获FuncB中的错误,而不是将FuncB定义为一个不会在错误中抛出的函数。它的代码更少,更易于管理。因此:

var err = function( msg ) {
  // ...
  throw(msg); 
};

var func3 = function() {
  // ...
  err('Double rainbow');
};

var funcB = function() {
  try {
    func3();
  catch(e) {
    console.log(e);
  }
};

试着理解为什么这是更好的解决方案,它是关于定义哪个功能属于哪个功能的责任。这正是异常和处理按此方式设计的原因。

我不确定您要解决什么问题,但我非常确定有比这更好的方法

也就是说,这里有一种跟踪函数和检查调用堆栈的方法,而无需解析特定于浏览器的堆栈跟踪:

var callstack = [];

function traced(name, func) {
  return function () {
    callstack.push(name);
    func.apply(this, arguments);
    callstack.pop();
  }
}
然后像这样使用它:

var a = traced("a", function () {
  b();
});

var b = traced("b", function () {
  c();
});

var c = traced("c", function () {
  var s = callstack.join("<br>");
  document.getElementById('output').innerHTML = s;
});

document.getElementById('a').onclick = a;
document.getElementById('b').onclick = b;

您可以在这里的fiddle上查看它:

+1分享您的经验:创建和维护状态空间的厄运可以推断是一篇有趣的博客文章。然而,因为我同意你的最后一句话,这似乎是一个坏运气的方法,它肯定会非常缓慢。