JavaScript для цикла неожиданного поведения - PullRequest
4 голосов
/ 03 июля 2010

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

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

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?

Спасибо.

Ответы [ 2 ]

10 голосов
/ 03 июля 2010

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

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

Оператор for состоит из:

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

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

  1. The 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 голосов
/ 07 августа 2015

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

Это напечатает до двух значений, как вы и предполагали:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...