Защо методът се изпълнява веднага, когато използвам setTimeout?

Опитвам се да напиша прост код с setTimeout, но setTimeout просто няма да изчака времето, за което трябва, и кодът се изпълнява веднага. какво правя грешно

setTimeout(testfunction(), 2000);

person Adler    schedule 21.08.2011    source източник
comment
() действа като оператор за извикване тук. Но вие искате да предадете функцията на setTimeout, а не да я извиквате.   -  person Šime Vidas    schedule 21.08.2011


Отговори (6)


Извиквате незабавно функцията и планирате нейната върната стойност.

Използвайте:

setTimeout(testFunction, 2000);
                       ^

Забележка: без скоби.

person Mat    schedule 21.08.2011
comment
добре, благодаря.. но има ли начин да изпратите параметри на функцията като setTimeout(testFunction(obj),2000)??! между другото това няма да работи твърде setTimeout(alert(test),2000).. - person Adler; 21.08.2011
comment
@Adler: Да: setTimeout(function() { alert("test"); }, 2000); - person T.J. Crowder; 21.08.2011
comment
@Adler: Възможно е да се направи setTimeout(alert, 2000, "test"), но не се поддържа от IE. - person pimvdb; 21.08.2011
comment
@Adler: Вижте също: stackoverflow.com/questions/1190642/ - person Mat; 21.08.2011

Премахнете скобите

setTimeout(testfunction(), 2000);

Ако искате да изпратите параметри към функцията, можете да създадете анонимна функция, която след това ще извика желаната от вас функция.

setTimeout(function() {

    testfunction('hello');

}, 2000);

Редактиране

Някой предложи да се изпрати низ като първи параметър на setTimeout. Бих предложил да не следвате това и никога да не изпращате низ като първи параметър setTimeout, защото ще се използва функцията eval. Това е лоша практика и трябва да се избягва, ако е възможно.

person Jose Faeti    schedule 21.08.2011

Премахнете скобите след името на тестовата функция:

setTimeout(testfunction, 2000);

Причината е, че първият аргумент на setTimeout трябва да бъде препратка към функция, а не върнатата стойност на функцията. Във вашия код testfunction се извиква незабавно и върнатата стойност се изпраща на setTimeout.

person Emil Vikström    schedule 21.08.2011
comment
добре, благодаря.. но има ли начин да изпратите параметри на функцията като setTimeout(testFunction(obj),2000)??! между другото това няма да работи твърде setTimeout(alert(test),2000)... - person Adler; 21.08.2011
comment
@Adler да, можете да подадете всичките си аргументи след аргумента за забавяне, като този: setTimeout(testFunction, 2000, obj) - person Brandon McConnell; 29.05.2021

Е, може би сте получили отговора, но аз обяснявам причината и решението. Има два начина, по които можете да извикате функция след необходимото време.

1. setTimeout("FUNC_NAME ()', TIME_IN_MS);
Тук FUNC_NAME в двойни кавички е оригиналната функция, която искате за извикване след TIME_IN_MS милисекунди. Това е така, защото ако не поставите кавичките, докато java скриптът се интерпретира, функцията ще бъде незабавно изпълнена и вашата цел ще бъде провалена. За да позволим на интерпретатора да пропусне оператора, трябва да поставим кавички тук.< br> 2. setTimeout(function () {FUNC_NAME ()}, TIME_IN_MS);
Тук се създава анонимна функция, която казва на интерпретатора да изпълни if след определено време, вместо да оценява времето.

Благодаря shaILU

person shaILU    schedule 21.08.2011

Първо премахнете скобите:

setTimeout(testfunction, 2000);

И след това, ако искате да предадете параметри във функцията setTimeout, можете да предадете по този начин:

 setTimeout(testfunction, 2000, param1, param2);

Забележка: Можете да подадете няколко параметъра според вашите функционални изисквания.

person Shraddha    schedule 27.09.2020

Премахнете скобите, в момента незабавно извиквате функцията. Това, което в момента се предава на setTimeout, е върнатата стойност от извикването на testfunction(), но това, което трябва да предадете на setTimeout като първи аргумент, е препратка към функция

setTimeout(testfunction, 2000);
person Jonathan Utsu Undelikwo    schedule 01.12.2020