回答
快速和骯髒的基於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