2017-02-09 2 views
1

я искал вокруг на пару вопросов, связанных с использованием для цикла и setInterval функции в JavaScript, но я couldn't найти конкретный ответ на то, почему этот фрагмент Безразлично Не работайте. Может кто-нибудь объяснить, пожалуйста, что происходит под капотом и почему этот код ничего не печатает?JavaScript: setInterval и петли объяснения

for (let i = 0; i++; i < 10) { 
    window.setInterval(function() { 
     console.log('Test'); 
    } , 100) 
} 
+3

У вас есть условие, смешанное с приращением. 'i <10; i ++ ' – Ryan

+1

Хотя условие не в том месте, было бы также необычным запустить такой же' setInterval' в таком цикле. Обратный вызов будет выполняться 10 раз каждые 100 мс. –

+0

Спасибо, ребята, извините за durp. – user3682983

ответ

2

Неправильная петля for10. Условие должно быть вторым оператором в цикле for.

Следующий код должен работать.

for (let i = 0; i < 10 ; i++;) { 
    window.setInterval(function() { 
     console.log('Test'); 
    } , 100) 
} 

Ожидаемый Синтаксис for петля. Вы можете прочитать больше here

для ([инициализации]; [состояние] [окончательного выражения])
заявление

EDIT 1:
Хотя все ответы (в том числе и у меня) что условие должно быть вторым утверждением в цикле for, что является правильным. Есть еще одно важное важное поведение.

Цикл for for (let i = 0; i++; i < 10) на самом деле правильный с точки зрения грамматики, и даже javascript runtime выполняет этот код.

Но, как в вашем случае, если условие вычисляемая falsy значения, то это было бы выйти из цикла.

Сломать цикл for (let i = 0; i++; i < 10) в каждый индивидуальный построить

  1. Инициализация:let i = 0; Это утверждение инициализирует значение переменной я до 0.

  2. Состояние:i++; Javascript оценивает заявление чтобы проверить, истинно это утверждение или нет. В случае i++ время выполнения сначала проверяет текущее значение i, которое равно 0. Поскольку 0 считается значением falsy, условие принимает значение false и, следовательно, оператор не выполняется. Кроме того, оператор i++ является приращением по почте, который в основном увеличивает i, а затем возвращает исходное значение i.

Так что, если бы вы написали цикл, как показано ниже, используя intiliaztion из i=1, то это сработало бы, хотя бы работать бесконечно до тех пор пока происходит сбой браузера/Server как условие i++ всегда будет вычисляться правда. Я надеюсь, что в этом есть смысл.

for (let i = 1; i++; i < 10) { 
    // Statements would run 
} 

Или

for (let i = 0; ++i; i < 10) { **// Pre increment** 
    // Statements would run 
} 

Или

for (let i = 0; i=i+1; i < 10) { **// increment i by assigment 
     // Statements would run 
    } 

Дуглас Крокфорд в своей книге Good Parts упомянуть об использовании ++ & -- и как это может ввести в заблуждение читателей.

1

ваш цикл синтаксис неправильно, должен быть

for (let i = 0; i < 10; i++) 

ваш setInterval код будет работать каждые 100 миллисекунд для каждой итерации цикла (так 10 раз через каждые 100 миллисекунд)

1

Nothing setInterval, вы просто исказили свой цикл for:

Это:

for (let i = 0; i++; i < 10) 

Должно быть так:

for (let i = 0; i < 10; i++) 

Прежде объявить начальное состояние цикла, то состояние нагрузочного контура, то инкрементного изменение контура.

Observe.

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