setTimeout() в цикле for

list = [1000,2000,3000,4000];
for (var i = 0; i < 4; i++) {
    setTimeout(console.log('Hello'), list[i]);}

Почему этот код не выводит «Привет» после времени в списке?


person arij asad    schedule 04.05.2016    source источник
comment
вы передаете результат console.log в setTimeout`   -  person Daniel A. White    schedule 04.05.2016
comment
Пожалуйста, не редактируйте свой вопрос, если это редактирование делает существующие ответы устаревшими. Вместо этого было бы лучше задать новый вопрос, но в этом случае это также будет дублированием.   -  person Paul    schedule 04.05.2016
comment
Кроме того, я не рекомендую передавать строку в setTimeout. Существует много причин, по которым это плохая идея.   -  person Paul    schedule 04.05.2016
comment
В частности, вы не должны редактировать свой вопрос, чтобы исправить свой код.   -  person Sebastian Simon    schedule 04.05.2016


Ответы (3)


это правильный способ сделать это:

list = [1000,2000,3000,4000];
for (var i = 0; i < 4; i++) {
    setTimeout(function(){console.log('Hello')}, list[i]);}

потому что setTimeout принимает функцию обратного вызова, а не инструкцию

person Akram Saouri    schedule 04.05.2016
comment
Как вариант, setTimeout("console.log('Hello')", list[i]); - person Alex Kudryashev; 04.05.2016
comment
Используя JS bin и its saying, dont, используйте функцию в цикле. Должен ли я использовать другую программу. - person arij asad; 04.05.2016
comment
Взгляните на jsfiddle.net. - person Akram Saouri; 04.05.2016

Вы вызываете console.log() немедленно и передаете возвращаемое значение в качестве аргумента setTimeout.

Вы должны передать функцию. Метод bind() вернет новую функцию, которая вызывает log с правильным контекстом и указанными вами аргументами.

setTimeout(console.log.bind(console, 'Hello'), list[i]);
person Quentin    schedule 04.05.2016

Попробуй это

list = [1000,2000,3000,4000];
for (var i = 1; i <= 3; i++) {
    (function(index) {
        setTimeout(function() { alert(index); }, i * list[i]);
    })(i);
}
person Wasiq Muhammad    schedule 04.05.2016