Почему я не могу прочитать изменение глобальных переменных в вложенной функции?
Вы находитесь. Это всего лишь логическая ошибка, к моменту возникновения ваших обратных вызовов setTimeout
вы установили ее назад в 0: вы увеличиваете num
каждые 100 мс, устанавливая его на 0, когда оно достигает 10, а затем останавливает процесс приращения. После 2000 мс вы показываете значение num
. В этот момент это будет 0, потому что он достиг 0 после 10 циклов с интервалом 100 мс, второй раз.
Другими словами, вот что происходит:
- Время 0ms: Вы устанавливаете
num
в 0
- Время 0ms: Вы создали повторяющийся интервал таймера (
setInterval
) в 100мс
- времени ~ 100мс : интервал срабатывает в первый раз:
- Он устанавливает первую функцию обратного вызова для 2000 мс позже
- Изменениядо 1
- Время ~ 200мс: Интервал срабатывает во второй раз:
- Он устанавливает первую функцию обратного вызова для 2000 мс позже
- Изменения
num
до 2
- Это происходит снова ~ 400 мс (num -> 6), ~ 700 мс (num -> 7), ~ 800 мс (num -> 8), ~ 900ms (num -> 3)
- Время ~ 1000 мс: T он интервал выстреливает в последний раз:
- Он устанавливает еще одну функцию обратного вызова для 2000 мс позже
- Он устанавливает Num до 10, затем до 0 и отменяет интервала
- Время ~ 2100ms: Первый
setTimeout
обратного вызова срабатывает, показывая Num = 0
- Время ~ 2200ms: второй
setTimeout
обратного вызова пожары, показывая Num = 0
- ... и так далее