setTimeout() в for цикъл

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

Защо този код не извежда „Hello“ след времената в списъка?


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