SetTimeout и рекурсивность с огурцом
У меня есть функция, написанная на JavaScript, вызывающая себя рекурсивным способом:
function f(attempt){
if (attempt + 1 <= 10) {
setTimeout(f(attempt + 1),2000);
}
}
f(0);
По неизвестной причине функция эффективно вызывается 10 раз, но без задержки. SetTimeout, кажется, немедленно выполняет функцию f.
Однако, когда я делаю это, тогда все работает нормально:
function f(attempt){
if (attempt + 1 < 10) {
setTimeout(function(){f(attempt + 1);},2000);
}}
f(0);
У вас есть объяснение? Это потому, что этот код написан для тестирования огурца?
3 ответа
Вы должны передать функцию в качестве параметра setTimeout
это означает отсутствие круглых скобок в конце f
, То, что вы делаете сейчас, зовет f
и передать это возвращаемое значение setTimeout
, Вы можете передать аргументы f
в качестве третьего аргумента setTimeout
, Ваш звонок должен выглядеть так:
setTimeout(f, 2000, attempt + 1);
setTimeout(f(attempt + 1),2000);
Приведенный выше код вызывает функцию setTimeout, и вместо передачи функции для вызова она передает результат вашей функции f(), она вызывается прямо на месте.
setTimeout(function() { f(attempt + 1) },2000);
Но в этом случае вы передаете ссылку на вашу функцию, которая будет вызвана через 2000 секунд, поэтому она не оценивает саму функцию на месте.
Вы должны написать это так. Это альтернативный способ сделать чек и не иметь личных переменных.
function f(){
if(++attempt<10){// not shure
setTimeout(f,2000);
}
}
var attempt=0;
f();
демонстрация