我有一个用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);
你有解释吗?是因为这段代码是为黄瓜测试编写的吗?
答案 0 :(得分:3)
您必须将函数作为参数传递给setTimeout
,这意味着f
末尾没有括号。您现在正在做的是调用f
并将其返回值传递给setTimeout
。您可以将参数传递给f
作为setTimeout
的第三个参数。你的电话应该是这样的:
setTimeout(f, 2000, attempt + 1);
答案 1 :(得分:2)
setTimeout(f(attempt + 1),2000);
上面的代码调用了setTimeout函数,而不是传递函数来调用它传递你的f()函数的结果,它就在现场调用。
setTimeout(function() { f(attempt + 1) },2000);
但是在这种情况下,你传递的函数引用要在2000秒内调用,因此它不会在现场评估函数本身。
答案 2 :(得分:0)
你应该这样写。 这是进行检查的另一种方法,没有私人变种。
function f(){
if(++attempt<10){// not shure
setTimeout(f,2000);
}
}
var attempt=0;
f();
<强>演示强>