Можно ли прервать поток выполнения JavaScript?

Я всегда думал, что, поскольку JavaScript был однопоточным-потоком, я мог прикреплять обработчики событий, не беспокоясь о том, что обработчики будут выполняться, пока я выполнял код. К моему удивлению, я обнаружил, что они могут. Согласно этому ответу, диалоговое окно «Скрипт, не отвечающий на запросы» может вызвать возникновение событий во время выполнения сценария.

Я протестировал это с помощью следующего кода:



(jsFiddle)

В Firefox 11.0 функция печатает «выход из цикла» после нажатия кнопки «Продолжить». Кажется, что цикл приостановлен, и события разрешены для выполнения. Это похоже на сигнал Unix, который временно изменяет контекст целевого потока. Но это гораздо опаснее, так как позволяет изменить внешнее состояние.

Это ошибка? Должен ли я больше не зависеть от модели одиночного-потока-исполнения-JavaScript и гарантировать, что все мои сценарии повторно-входим? Или это недостаток, на который не стоит обращать внимание, несмотря на то, что основной браузер позволяет это делать?

20
задан Community 23 May 2017 в 10:29
поделиться