我一直認爲,因爲JavaScript是單線程的,所以我可以附加事件處理程序,而不用擔心處理程序在執行代碼時執行。令我驚訝的是,我發現他們可以。根據this answer,,當腳本仍在運行時,「無響應腳本」對話框可能會導致事件發生。可以中斷JavaScript執行流程嗎?
我用下面的代碼測試此:
<script>
function loop() {
var cond;
onblur = function (event) {
cond = false;
};
cond = true;
while (cond)
;
alert('loop exited!');
}
</script>
<button onclick="loop()">loop()</button>
在Firefox 11.0,該函數打印點擊繼續後, 「循環退出」。循環似乎暫停,並允許執行事件。這類似於臨時更改目標線程的上下文的Unix signal,。但它更加危險,因爲它允許改變外部狀態。
這是一個錯誤?我是否應該不再依賴JavaScript的單流執行模型並確保我的所有腳本都可以重入?或者,儘管有大型瀏覽器允許這種情況發生,但它是不是值得追求的缺陷?
我想真正的問題是:「標準要求什麼。」 – 2012-03-19 22:11:21
我認爲最好考慮一些內置行爲('alert()'等)發生的「暫停」,因爲解釋器的形式會迫使當前正在運行的函數產生「yield」,然後,當「暫停」完成時,恢復執行。換句話說,認爲在「暫停」正在進行的同時實際返回的功能,然後繼續作爲延續繼續。這樣,事件處理變得更加有意義,因爲它就像普通的事件處理一樣。 – Pointy 2012-03-19 22:18:04
獲取「無響應的腳本」提示並不是您應該設計的正常事情。你的應用程序壞了,用戶從來沒有得到這些對話框之一。你應該設計你的腳本,這樣就不會出現「無響應的腳本」提示,然後你就不必擔心重新進入。在我看來,一個主要的瀏覽器允許事件在該提示中觸發時有點小錯誤,但我認爲修復代碼更重要,因此提示從不發生,這不是問題。 – jfriend00 2012-03-19 22:18:10