0

我有一个用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);

你有解释吗?是因为这段代码是为 Cucumber 测试编写的吗?

4

3 回答 3

3

您必须将函数作为参数传递给setTimeout,这意味着 . 末尾没有括号f。您现在正在做的是调用f并将其返回值传递给setTimeout. 您可以将参数f作为 的第三个参数传递setTimeout。您的通话应如下所示:

setTimeout(f, 2000, attempt + 1);
于 2014-04-29T14:47:52.743 回答
2
setTimeout(f(attempt + 1),2000);

上面的代码调用 setTimeout 函数,而不是传递一个函数来调用它,而是传递你的 f() 函数的结果,它被当场调用。

  setTimeout(function() { f(attempt + 1) },2000);

但是在这种情况下,您传递的是对要在 2000 秒内调用的函数的引用,因此它不会当场评估函数本身。

于 2014-04-29T14:49:16.820 回答
0

你应该这样写。这是进行检查的另一种方法,并且没有私有变量。

function f(){
 if(++attempt<10){// not shure 
  setTimeout(f,2000);
 }
}
var attempt=0;
f();

演示

http://jsfiddle.net/3nm2Q/

于 2014-04-29T15:03:42.960 回答