Почему метод выполняется сразу, когда я использую 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
@Адлер: Да: 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 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 через определенное время вместо оценки времени.

Спасибо.

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