回答
快速和肮脏的基于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
看起来从栈顶downwar d在堆栈中查找函数的第一个实例,然后返回它的直接调用者,所以不需要小心,你可以循环无限地查找调用者。
另一个告诫caller
的是,展望未来,如果你的任何代码使用的ECMAScript 5的严格模式,(这已经自己从严格模式函数调用或功能)严格模式功能caller
属性是所谓所谓的“毒药丸”在访问时抛出TypeError
。 “绑定”功能(由ES5的Function.prototype.bind
方法创建的那些)的属性caller
也是一种毒药。这些限制破坏了通用的栈走算法,尽管可以想象使用特定的方法来解决这个问题(可能是进入和退出注释函数)。
请注意,像这样的栈走并不是生产代码中的一个好主意(作为一个快速的黑客来调试它很好,寿);在Mozilla的JS引擎中,像在后面的例子中一样走栈时,它可能会让你退出机器代码并返回到解释代码中。此外,堆栈走线是O(如果您倾向于拥有复杂的深层堆栈,则这可能很重要)。
谢谢,这是关于我在找什么。 – rosscj2533 2010-01-14 18:44:09
这个答案今天仍然相关吗? – naaz 2017-07-29 01:01:06
堆栈走并不像以前那么昂贵,但它仍然会伤害到一定程度的性能。在最近的ECMAScript版本中,毒丸属性函数的一些更精细的细节已经发生了变化,但总的推力大部分是相同的。除了这两点之外,我认为评论仍然具有根本性的相关性。 – 2017-10-04 18:46:39
如果您使用Firefox,请使用像Firebug这样的调试器。 Chrome和Opera有内置调试器。 Internet Explorer有Developers Tools。
谢谢,我知道这些选项,但我想知道是否有一种方法可以不使用调试器。 – rosscj2533 2010-01-13 21:10:47
IMO调试javascript的最简单和最快捷的方法是使用调试器。 – 2010-01-13 21:13:38
使用调试器是没有问题的,而且通常很方便,我只是想在正确的情况下查找调用堆栈。 – rosscj2533 2010-01-14 18:45:43
调试Javascript的最佳方式是使用Firebug,其中包括一个完整的Javascript调试器。
如果您在IE中进行调试,您可以使用Visual Web Developer Express(或任何其他版本的Visual Studio)。
如果您正在调试IE8,您可以使用其内置的开发人员工具,其中包括一个调试器。
可以在Javascript中获得调用堆栈;见here。
你看过萤火虫 - 还有一个断点。如果只是为了调试,那么这可能就足够了。
而且 - 你可以看看Here
这会给你所有调用堆栈 对我很好。
var y = 'arguments.callee.caller';
while (eval(y) != undefined) {
stak += eval(y + '.toString()');
y = y + '.caller';
}
alert(stak);
对于调试的NodeJS,在Visual Studio代码,v.1.14.2,它的视图 - >调试(按Ctrl + Shift + d)
- 1. 有没有办法在javascript中动态查看调用堆栈?
- 2. 退出当前调用堆栈的Javascript
- 3. 有没有办法从Xcode调试器中的调用堆栈中删除内联函数?
- 4. JavaScript调用堆栈
- 5. 有没有办法调试plist文件?
- 6. HTRACE没有显示出调用堆栈
- 7. 有没有办法从调用堆栈中获取最后一个表单类?
- 8. Android WebView:有没有办法获得一个javascript堆栈跟踪?
- 9. 获取当前调用堆栈
- 10. javascript调试:有没有办法打破变量值的变化?
- 11. Windows CE 6远程调试。暂停程序时没有调用堆栈
- 12. 有没有办法在递归调用之前检查可用的堆栈大小? (C#)
- 13. 有没有办法让移动设备上的Visual Studio调试唤醒事件?
- 14. 有没有办法在wkhtmltopdf中调试或捕获javascript错误?
- 15. 有没有办法使用带树列表的视图堆栈
- 16. 有没有办法在AWS cloudformation中配置嵌套堆栈的“堆栈名称”?
- 17. crossfilter javascript超过最大调用堆栈大小,没有南
- 18. 有没有Javascript调试API?
- 19. 清除JavaScript调用堆栈
- 20. 调用堆栈增加javascript
- 21. 调用保留调用堆栈的私有方法
- 22. Lua:调用不带参数的error()时没有堆栈跟踪?
- 23. STM32f429ZI在没有调试器的情况下记录调用堆栈
- 24. 有没有办法让executionTimeout在调试时生效?
- 25. 有没有办法在运行时访问调试符号?
- 26. 加载dll时有没有办法调试发布版本?
- 27. 有没有办法调试Facebook即时文章?
- 28. 有没有办法在运行泄漏时调试(iPhone)?
- 29. 有没有办法调用“New”类?
- 30. 有没有办法从ExternalInterface调用Javascript类方法?
这是用于调试或生产?我不确定在所有浏览器中都有这样的标准方式,但是可能会有一些有用的功能仅适用于某些浏览器... – 2010-01-13 21:20:31
这只是为了调试目的。 – rosscj2533 2010-01-13 21:25:53