2014-12-28 74 views
2

我有一個編輯器,用戶可以輸入他們的javascript並顯示他們的輸出。但我想要一個安全條件來阻止他們意外地創建一個無限循環。問題是我真的不想解析代碼並尋找任何循環,然後添加額外的條件。我期望的是預構建的功能,可以在一定量的內存後自行取消,以避免瀏覽器崩潰。但我不確定如何做到這一點。如何通過內存阻止javascript中的無限循環?

+0

我認爲這可以幫助你:http://www.nczonline.net/blog/2009/05/19/javascript-stack-overflow-error/ 它解釋hapen當你創造無限的循環以及如何處理這個(通過瀏覽器) –

+1

@MrJedi這幾乎是無關緊要的。 'while(true){}'不會引發你可以處理的錯誤。 – meagar

回答

3

JS BIN運行一個名爲loop-protect的開源項目,你可以使用它,它很容易實現。

Codepen has article on that

+0

整潔。我不知道環路保護。不幸的是,它不處理遞歸。 –

+0

是的,有[Esprima](http://esprima.org/)JavaScript解析器的幫助,這是可能的。 –

+0

對於無限遞歸情況似乎不那麼重要,因爲腳本在發生遞歸錯誤後會失敗,因此它不會崩潰或凍結瀏覽器。 –

1

沒有通用的方法在JavaScript本身中執行此操作因爲瀏覽器中的JavaScript是單線程的*如果「惡意」腳本從不產生,那麼您的代碼將無法運行 - 殺死用戶的腳本。

在某些情況下,運行時可以爲您做到這一點 - Internet Explorer臭名昭着its obnoxious error messages,但我不知道任何平臺不可知的方式來請求這種環境保護。


*忽略網絡工作者,因爲消息處理主「線程」的發生反正這是不相關的討論。

0

的乾淨的解決方案可能是解釋的JavaScript。 。這是http://repl.it是怎麼做的((http://repl.it/help)),還有就是當你做無限循環非常好的反饋var f=function(){f();};f();產生這樣的輸出:RangeError: Maximum call stack size exceeded

JS-解釋似乎解釋與橡果JS的JavaScript和你可能會能增加檢測無限循環:https://github.com/NeilFraser/JS-Interpreter

另一種選擇是使用網絡工作者(https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/basic_usage):