Я всегда думал, что, поскольку JavaScript был однопоточным, я мог присоединять обработчики событий, не беспокоясь о том, что обработчики выполняются, пока я был в середине выполнения кода. К моему удивлению, я обнаружил, что они могут. Согласно этот ответ, диалоговое окно "Невосприимчивое Script" может вызвать события, которые должны быть подняты, пока script все еще работает.
Я проверил это со следующим кодом:
<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 функция выводит "loop exited" после нажатия кнопки continue. Кажется, что петля приостановлена, и события разрешены для выполнения. Это похоже на Сигнал Unix, который временно изменяет контекст целевого потока. Но это намного опаснее, так как позволяет изменять внешнее состояние.
Это ошибка? Должна ли я больше не зависеть от модели JavaScript с одним потоком исполнения и гарантировать, что все мои скрипты будут повторно введены? Или это недостаток, которого не стоит преследовать, несмотря на то, что основной браузер позволяет это произойти?