我已經閱讀了以下主題is-javascript-guaranteed-to-be-single-threaded 打斷還有就是很好的例子有:爲什麼我的腳本JS的事件處理程序
<textarea id="log" rows="20" cols="40"></textarea>
<input id="inp">
<script type="text/javascript">
var l= document.getElementById('log');
var i= document.getElementById('inp');
i.onblur= function() {
l.value+= 'blur\n';
};
setTimeout(function() {
l.value+= 'log in\n';
l.focus();
l.value+= 'log out\n';
}, 100);
i.focus();
</script>
輸出是
log in
blur
log out
,而不是預期的
log in
log out
blur
所以這基本上顯示我的事件處理程序blur
被觸發,這會中斷setTimeout回調內代碼的執行。我讀過幾篇文章和解釋,說明代碼不會被打斷(run-to-completion principle),除了一些角落案例,如模式彈出窗口(警報,提示窗口)。那麼爲什麼在這個例子中被打斷?
我唯一可以解釋的是我從代碼手動觸發focus
事件,同時控制執行是在JS引擎上。如果不是手動觸發,代碼執行期間的模糊事件將被瀏覽器檢測到並放入隊列中,只有在代碼執行完成後(堆棧爲空),隊列纔會被處理。
這是不是解釋了你從代碼複製的答案? – Barmar 2014-09-11 09:48:44
嗯,這個問題的答案是,作者將這個例子與模態彈出窗口混合在一起'這些事件不僅僅是因爲你直接調用了focus(),而是因爲你調用了alert()或者打開了一個pop-窗口或其他任何可以移動焦點的窗口。然後他的大部分答案都與模態彈出窗口有關。然而,第一個例子和模式彈出窗口非常不同。 – 2014-09-11 09:53:08
他在代碼的上方解釋了它:_Browsers會在你的代碼執行某些操作時立即觸發這些代碼:_ – Barmar 2014-09-11 09:54:49