Проблема в том, что весь цикл for был выполнен еще до того, как вы успели нажать кнопку. setTimeout на самом деле не спит и не блокирует, а помещает новое событие и просто продолжает цикл for.
Браузер, все его часы для целей тайм-аута и т. Д. Могут работать только после того, как ваш код на данный момент завершил работу. Нет функции, эквивалентной функции sleep ().
Возможно использование асинхронных функций (ES2015 IIRC, должно поддерживаться всеми текущими браузерами, отличными от IE), и ожидание обещания, созданного util.promisify(setTimeout)(2000)
, может быть более интуитивно понятным.
Функции блокировки отсутствуют. Там нет спящего внутри кода. Весь код в основном выполняется на ЦПУ и устанавливает события ввода-вывода и таймера, которые происходят асинхронно, как только синхронная часть уже завершена.
По этой причине JavaScript не интуитивно понятен. Однако вы можете почувствовать ценность асинхронности, когда увидите, что таким способом можно получить одно доброе представление. Я имею в виду ... Пока сам код JS выполняет DOM, браузер не может его проверить. Вы не можете прокрутить, вы не можете щелкнуть, курсор мыши не изменит своего вида. Только после завершения блока кода браузер будет обрабатывать все ожидающие события.