2016-12-20 2 views
-1

Я пытаюсь установить задержку для цикла в JavaScript. Я хочу, чтобы войти i, имеют задержку, а затем войти i, и так далее. Мой вопрос, почему следующий код работы, имеющий функцию, возвращающую функцию можно увидеть ниже:SetTimeout внутри для цикла

for (var i = 1; i <= 5; i++) { 
     var tick = function(i) { 
      return function() { 
       console.log(i); 
      } 
     }; 
     setTimeout(tick(i), 500 * i); 
    } 

И следующий код не работает, как ожидалось:

for (var i = 1; i <= 5; i++) { 
    var tick = function(i) { 
     return console.log(i); 

    }; 
    setTimeout(tick(i), 500 * i); 
} 

Он печатает все значения в цикле for за один раз. Может кто-нибудь объяснить, почему это происходит?

+2

первого аргумент SetTimeout должен быть функцией, не является результат не вызов функции, если, как в елях т случай, результат вызова функции является сам –

+0

переключатель 'функция var' в' let' – Endless

+0

@Endless - никакой разницы, как второй пример кода будет пытаться вызвать 'undefined' после тайм-аута –

ответ

3

В обоих кусков кода, tick(i) выполняется непосредственно в каждом цикле

Разница заключается в том, что в первом примере, тик (я) возвращает функцию, которая вызывается SetTimeout, и что выходы к Консоль

Во втором примере консоль.log вызывается немедленно, undefined возвращается, а setTimeout ничего не делает, как только таймаут запускается, поскольку данный аргумент не является функцией (или строкой, которая должна быть оценена)

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