2016-08-21 7 views
0

// это код вопрос о вложенных функций и функции таймера Почему я не могу прочитать изменение глобальных переменных во вложенной функции?

var num = 0; //the key of this problem 
 
\t var timer = null; 
 
\t timer = setInterval(function() { 
 
     //num could change from 0 to 9 in this function 
 
\t \t console.log(num); 
 
\t \t setTimeout(function() { 
 
\t \t console.log(num); //but in this place, num is always 0,why? 
 
\t \t }, 2000); \t 
 

 
\t \t num++; \t \t \t \t \t 
 
\t \t if (num >= 10) { \t \t \t \t \t \t 
 
\t \t \t num = 0; 
 
\t \t clearInterval(timer); 
 
\t \t } 
 
\t }, 100);

ответ

5

Почему я не могу прочитать изменение глобальных переменных в вложенной функции?

Вы находитесь. Это всего лишь логическая ошибка, к моменту возникновения ваших обратных вызовов setTimeout вы установили ее назад в 0: вы увеличиваете num каждые 100 мс, устанавливая его на 0, когда оно достигает 10, а затем останавливает процесс приращения. После 2000 мс вы показываете значение num. В этот момент это будет 0, потому что он достиг 0 после 10 циклов с интервалом 100 мс, второй раз.

Другими словами, вот что происходит:

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