2010-07-03 4 views
4

У меня есть пара вопросов о цикле javascript for.javascript for loop неожиданное поведение

Первый вопрос:

for (i=0; i<=2; i++) {;} 
console.log(i); 

Вывод 3. Если не было бы 2?

Второй вопрос:

for (var i=0; i<=2; i++) { 
    setTimeout(function(){console.log(i);}, i*1000); 
} 

Таймауты установлены правильно: 0, 1000 и 2000. Но выход 3,3,3 (должен быть 0, 1, 2). Означает ли это, что выполняются функции с задержкой после выход петли? Зачем?

Что я должен читать, чтобы понять все эти загадочные вещи в JavaScript?

спасибо.

+0

+1 Я ищу для этого тоже) – naiad

ответ

9

Первый вопрос:

Нет, потому что переменная i увеличивается после последней успешной итерации, то условие проверяется и оценивается в false поэтому цикл заканчивается.

for заявление состоит из:

for ([initialExpression]; [condition]; [incrementExpression]) 
    statement 

И это выполняется в следующих шагах:

  1. initialExpression оценивается в начале
  2. condition оценивается, если он оценивается до false, цикл заканчивается, если он оценивается до true, утверждение вычисляется.
  3. Оцените утверждение.
  4. incrementExpression оценивается, перейдите к шагу 2.

Второй вопрос:

Функция выполняется асинхронно после завершения цикла, в это время, как вы знаете, i содержит 3 ,

Общий способ решения этой проблемы является использование функции, чтобы сохранить значение обхвата переменной на каждой итерации, например:

for (var i=0; i<=2; i++) { 
    (function (i) { 
    setTimeout(function(){console.log(i);}, i*1000); 
    })(i); 
} 
0

Это потому, что ваша инструкция console.log находится вне для цикла.

Это будет печатать до двух, как вы хотели:

for (i=0; i<=2; i++) { 
    console.log(i); 
} 

Для петель только несколько раз выполнить то, что вы вводите в скобках. Вот почему console.log был выполнен только один раз.

Источник: http://www.kompulsa.com/a-guide-to-for-loops-in-javascript/

Смежные вопросы